4 .1-14.3 并发-线程状态

14 .1-14.3 并发-线程状态

操作系统的多任务,同一时刻运行多个程序的能力。

并发执行的进程数目不是由CPU数目确定,由CPU时间片分配每一个进程。

一个程序执行多个任务,每个任务称为一个线程(thread),是线程控制的简称。同时运行一个以上线程的程序称为多线程程序。

 

多线程与多进程区别:每个进程拥有自己的一整套变量,线程共享数据。共享变量使线程之间的通信比进程之间通信更有效,与进程相比,线程更轻量,创建撤销线程比启动新进程开销更小。

 

多线程应用:一个浏览器同时下载多个图片;一个web服务器同时处理多个并发请求。

 

跳动的球,循环1000次,无法点击close按钮终止

Thread.sleep(休眠的毫秒数)不会创建新线程,静态方法,用于暂停当前线程活动。可以抛出InterruptedException

 

在一个单独的线程执行任务

1.实现Runnable接口,Runnable  r  = ()->{take code};

2.由Runnable创建一个thread对象

Thread t = new Thread(r);

3.启动线程 t.start();

 

在一个被阻塞的线程(sleep/wait)上调用interrupt方法时,阻塞调用抛出Interrupted Exception异常中断。

判断当前线程是否中断:Thread.current thread().isInterruped()


 

线程6种状态

创建:New

可运行:Runnable

被阻塞和等待:Blocked, Waiting, Timed Waiting

终止 : Terminated

确定某个线程处于什么状态,可调用getState方法

 

new操作符创建一个线程,new Thread(r), 还没运行

 

调用start方法,处于runnable状态,可能在运行,也可能没运行,取决于操作系统是否给线程提供运行时间

 

抢占式调度系统给每一个进程分配时间片运行,当时间片用完即剥夺运行权。基于优先级运行下一个线程。

现所有的桌面及服务器操作系统都使用抢占式调度。手机等小型设备可能采用协作式调度,线程只有在yield,或阻塞等待时才失去控制权。

多处理器机器上,每个处理器运行一个线程,运行线程数超处理器数时,仍采用时间片机制。

 

可运行线程可能在运行也可能不运行,所以叫可运行而不是运行。

 

线程被阻塞或等待时,不活动,不运行任何代码,消耗最少的资源。

处于该状态的场景(如何达到非活动状态):

1.某线程试图获取内部的一个对象锁(非java.util.concurrent),该对象锁被其它线程持有,该线程进入阻塞。对象锁被释放,线程调度器允许本线程持有该锁时,变为非阻塞。

2.线程等待另一个线程通知调度器的一个条件,进入等待。调用Object.wait, thread.join. 等待java.util.concurrent库的lock,condition。

3.有超时参数时,线程进入计时等待。方法:Thread.sleep,Object.wait,Thread.join,Lock.tryLock,condition.await

 

线程终止的原因:

run方法正常退出而死亡;

因为一个没有捕获的异常终止了run方法意外死亡。

 

调用stop杀死,抛出ThreadDeath异常。(该方法过时)

 

 

 

 

 

 

 

你可能感兴趣的:(java)