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类。

原文地址:https://www.cnblogs.com/minguo/p/10815546.html