> 文章列表 > Java核心技术知识点笔记—并发

Java核心技术知识点笔记—并发

Java核心技术知识点笔记—并发

前言:多任务(multitasking),即同一刻运行多个程序的能力。并发执行的进程数目并不是由CPU数目制约的。操作系统将CPU的时间片分配给每一个进程,给人并行处理的感觉。

1、线程(thread):多线程程序的概念,即可以同时执行多个任务的程序。其中,每个任务称为一个线程。

1.1、多线程与多进程的区别:

(1)本质区别在于,每个进程拥有自己的一整套变量,而线程则共享数据。

(2)共享数据可能存在风险,但这也使线程间的通信比进程间的通信更有效、更容易。

(3)在有些操作系统中,与进程相比,线程更“轻量级”,创建、撤销一个线程比启动新进程的开销小得多。

2、Java中实现线程操作:

2.1、Thread类:可以通过Thread类的子类定义一个线程。

class TestThread extends Thread{@Overridepublic void run() {//执行操作}
}

然后构造一个对象,并调用start方法。(注:这种方法已不再推荐。应该将要并行运行的任务与运行机制解耦合。)

        TestThread testThread = new TestThread();testThread.start();

2.2、Runnable接口:将任务代码移到Runnable接口的run方法中,由Runnable创建一个Thread对象。

        Runnable runnable = new Runnable() {@Overridepublic void run() {//任务代码}};Thread thread = new Thread(runnable);thread.start();

2.3、注意:直接调用Thread类或Runnable对象的run方法,只会执行同一个线程中的任务,而不会启动新线程。应该调用Thread类的start方法,这个方法将创建一个执行run方法的新线程。

2.4、中断线程:当线程的run方法方法体中的代码执行完毕,或经由return语句返回,或在代码执行过程中出现未捕获的异常,线程将终止。

(1)interrupt方法:没有可以强制线程终止的方法,但可以使用interrupt方法请求终止线程。

(2)调用interrupt方法,将使线程的中断状态被置为。每个线程都有这样一个boolean标志。每个线程应时刻检查这个标志,以判断线程是否被中断。

(3)判断线程中断状态是否被置位,可以先通过Thread.currentThread方法获得当前线程,然后调用isInterrupted方法。

(4)如果线程被阻塞,无法检测中断状态。对一个被阻塞线程(调用sleep或wait)调用interrupt方法,阻塞调用将会被Interrupted Exception异常中断。

(5)中断一个线程不等于线程终止。被中断的线程可以决定如何响应中断。某些线程可能非常重要以至于应该处理完异常后继续执行,而不理会中断。

(6)注意interrupted方法和isInterrupted方法:interrupted方法是一个静态方法,它检测当前线程是否被中断,并且会清楚该线程的中断状态;isInterrupted方法是一个实例方法,用来检测线程是否被中断,但不会改变线程的中断状态。

3、线程状态:New(新创建)、Runnable(可运行)、Blocked(被阻塞)、Waiting(等待)、Timed waiting(计时等待)、Terminated(被终止)

(1)New(新创建):线程还未开始运行。

(2)Runnable(可运行):当调用start方法,线程处于runnable状态。此状态的线程可能正在运行,也可能没有运行,取决于操作系统给线程提供运行的时间。开始运行的线程不必始终保存运行,它也可能被中断以便给其他线程获得运行机会。线程的调度细节依赖于操作系统提供的服务。

(3)被阻塞和等待:当线程被阻塞或进入等待状态时,它暂时不活动,即不运行任何代码且消耗最少的资源,直到线程调度器重新激活它。细节取决于它是如何达到非活动状态的:

(3.1)当一个线程试图获取一个内部的对象锁(不是java.util.concurrent库中的锁),而该锁被其他线程持有,则该线程进入阻塞状态。当所有其他线程释放该锁,且线程调度器允许该线程持有该锁的时候,该线程变成非阻塞状态。

(3.2)当线程等待另一个线程通知调度器一个条件时,该线程进入等待状态。

(3.3)有几个方法有一个超时参数。调用它们导致线程进入计时等待状态。这一状态将一直保持到超时期满或接收到适当的通知。带有超时参数的方法有:Thread.sleep、Object.wait、Thread.join、Lock.tryLock、Condition.await的计时版。

(4)被终止:线程因下列两个原因之一被终止

(4.1)run方法正常退出而自然死亡;

(4.2)一个没有捕获的异常终止了run方法而意外死亡。

特别:可以调用线程的stop方法杀死一个线程。该方法抛出ThreadDeath错误对象,由此杀死线程。但该方法已过时,不要再继续使用。