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异常。(该方法过时)