Java并发总结
什么是线程?
一个程序同时执行多个任务,每个任务称为一个线程(thread)。可以同时运行一个以上线程的程序被成为多线程程序(multithread)
创建一个线程并执行
new Thread().start();
中断线程
当线程的run方法执行方法体中最后一条语句后,并经由执行return语句返回时,或者出现了在方法中没有捕获的异常时,线程将终止。
没有可以强制线程终止的方法,但interrupt方法可以用来请求终止线程。
线程状态
线程有6种状态
New(新建)
Runnable(可运行)
Blocked(被阻塞)
Waiting(等待)
Timed waiting(计时等待)
Terminated(终止)
New(新建)
当用new创建一个新线程对象时,线程处于新建状态
Thread t = new Thread();
Runnable(可运行)
一旦调用start(),线程处于runnable状态,可能正在运行,也可能没在运行,这取决于系统给线程提供运行的时间。
抢占式调度系统会给每一个可运行线程一个时间片来执行任务,当时间片用完,操作系统剥夺该线程的运行权,并给另一线程运行机会,当选择下一个线程时,操作系统考虑线程的优先级。
Blocked(被阻塞)
当一个线程试图获得一个内部的对象锁,而锁被其他线程持有,则该线程进入阻塞状态
Waiting(等待)
当线程等待另一个线程通知调度器一个条件时,进入waiting(等待)状态
Timed waiting(计时等待)
有几个参数有一个超时参数,调用它们导致线程进入计时等待状态。这一状态将一直保持到超时期满或者接到适当通知
Terminated(终止)
线程因如下两个原因之一而终止:
因run方法正常退出而自然死亡
因为一个没有捕获的异常终止了run方法而意外死亡
线程属性
线程优先级
每个线程有一个优先级。默认情况下,一个线程继承自父线程的优先级,调用setPriority()设置。线程优先级高度依赖于系统,Windows有7个优先级,Oracle为Linux提供的JVM线程优先级被忽略
守护线程
t.setDaemon(true) 可以将线程转换为一个守护线程。守护线程的唯一用途是为其他线程提供服务
当只剩下守护线程时,JVM就退出了
线程组
线程组是一个可以统一管理的线程集合,默认情况下,创建的所有线程属于相同的集合,但也可以创建其他组
处理未捕获异常处理器
线程的run方法不能抛出受查异常,但非受查异常会导致线程终止。在线程死亡前,该异常被传递到一个用于未捕获异常的处理器。
该处理器实现了Thread.UncaughtExceptionHandler接口
如果不为独立的线程安装处理器,此时的处理器就是该线程的ThreadGroup对象
竞争条件(race condition),两个或两个以上的线程需要共享对同一数据的存储。
Java中有两种机制防止代码块受并发访问的干扰。synchronized关键字,ReentrantLock类。