Java的线程

一、线程

1、概念

如果程序只有一条执行路径,那么该程序就是单线程程序

如果程序有多条执行路径,嘛呢该程序就是多线程程序

2、线程和进程的区别

进程:正在运行的程序时系统进行资源分配和调用的独立单位,每一个进程都有他自己的内存空间和系统资源。此外进程不是同时进行的,因为单CPU

线程:是进程种的单个顺序控制流,是一条执行路径

3、多线程的意义

多线程的存在,不是提高程序的执行速度,其实是为了提高应用程序的使用率,程序的执行其实都是在抢CPU资源,CPU的执行权

多个线程都是在抢这个资源,而其中的某一个进程如果执行路径比较多,就会有更高的几率抢到CPU的执行权,但是不能保证哪一个线程能够在哪个时刻抢到,所以线程的执行有随机性

4、并行和并发

前者是逻辑上同时发生,指在某个时间内同时运行多个程序

后者是物理上同时发生,指在某个时间点同时运行多个程序

5、实现多线程程序的方法

1)继承Thread类(重写Thread类的run方法)

  • 自定义MyThread继承Thread类
  • 在MyThread类中重写run()
  • 创建MyThread类的对象
  • 启动线程对象(调用start方法)

2)实现Runnable接口

  • 自定义MyRunnable实现Runable接口
  • 在MyRunnable中重写run()
  • 创建MyRunnable类的对象
  • 创建Thread类的对象,并把第三步的对象作为构造参数传递

3)实现Callable接口

Collable:带泛型的接口

这里指定的泛型其实是call()方法的返回值类型

4)使用方法2的好处

可以避免由于Java单继承带来的局限性

适合多个相同程序的代码去处理同一个资源的情况,把线程同程序的代码,数据有效分离,较好的体现了面向对象的设计思想

5)使用方法3的好处和弊端

好处:

  • 可以有返回值
  • 可以抛出异常

弊端:

  • 代码比较复杂,一般不用

6、线程调度

1)分时调度模型

所有的线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间片

2)抢占式调度模型

优先让优先级高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的CPU时间片相对多一些

注意:Java使用的是抢占式调度模型

3)方法

public final int getPriority();//返回线程对象的优先级
public final void setPriority(int newPriority);//更改线程的优先级

注意:

  • 线程的默认优先级是5
  • 线程优先级的范围是1-10
  • 线程优先级高仅仅表示线程获取的CPU时间片的几率高

4)线程的生命周期

新建:创建线程对象(new)

就绪:有执行资格(start()),没有执行权

运行:有执行资格,有执行权(run())

阻塞:由于一些操作让线程处于了该状态,没有执行资格,没有执行权,而另外一些操作去可以把它激活,激活后则处于就绪状态

死亡:线程对象变成垃圾,等待被回收

8、控制线程的方法

线程休眠:

public static void sleep(long millis);

线程加入:

public final void join();等待线程终止

线程让行:

public static void yield();暂停当前线程对象,并执行其他多个线程

后台线程:

public final void setDarmon(boolean on);

中断线程:

public final void stop();让线程停止,过时了还可以使用

public void interrupt();中断线程,把线程的状态终止,并抛出一个InterruptedException

获取线程的名称:

public final String getName();

设置线程的名称:

public final void setName(String name);

返回当前正在执行的线程对象:

public static Thread currentThread();

注意:

线程中有start和run方法,但二者有区别

strat():首先启动了线程,然后再由JVM去调用改线程的run()方法

run():仅仅是封装被线程执行的代码,直接调用的是普通方法

9、线程组

1)概述

把多个线程组合到一起

2)方法

public final ThreadGroup getThreadGroup();

10、线程池

1)概述

线程池里的每一个线程代码结束后,并不会死亡,二十再次回到线程池中成为空闲状态,等待下一个对象来使用

2)Executor产生线程池的方法

public static ExecutorService new CachedThreadPool();

public static ExecutorService new FixedThreadPool(int nThreads);

public static ExecutorService new StngleThreadExecutor();

这些方法的返回值时ExecutorService对象,该对象表示一个线程池

shutdown();结束线程池

附:Java线程池详解及五种线程池方法详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

z.haoui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值