首页 > 代码库 > 《Java核心技术》---- 多线程

《Java核心技术》---- 多线程

API:

java.lang.Thread

  • static void sleep(long millis) 休眠给定的毫秒数。
  • Thread(Runnable target) 构造一个新线程,用于调用给定target的run()方法。
  • void start() 启动这个线程,将引发调用run()方法。这个方法将立即返回,并且新线程将并行运行。
  • void run()调用关联Runnable的run方法。
  • void interrupt() 向线程发送中断请求。线程的中断状态将被设置为true。如果目前该线程被一个sleep调用阻塞,那么, InterruptedException异常被抛出。
  • static boolean interrupted() 测试当前线程(即正在执行这一命令的线程)是否被中断。这是一个静态方法。这一调用会产生副作用,它将当前的中断状态重置为false.
  • boolean isInterrupted() 测试线程是否被终止。不像静态的中断方法,这一调用不改变线程的中断状态。
  • static Thread currentThread() 返回代表当前执行线程的Thread对象。

 

java.lang.Runnable

  • void run() 必须覆盖这个方法,并在这个方法中提供所要执行的任务指令。

 

一,中断线程

  可以调用interrupt()方法发送中断请求。但是,如果线程被阻塞,就无法检测中断状态。这是产生InterruptedException异常的地方。当在一个被阻赛的线程(调用sleep或wait)上调用interrupt方法时,阻塞调用将会被InterruptedException中断。

发出中断请求并不意味着线程立即会终止,发送请求只是要引起线程注意,要求中断的线程可以决定如何处理这个中断请求。某些线程会处理完异常后,继续执行,而不理会中断。但是更普遍的情况是,线程将简单地将中断作为一个终止的请求。即如下代码:

public void run() {
    try {
        ...
        while(!Thread.currentThread().isInterrupted() && more work to check) {
            do more work;
        }
    } catch (InterruptedException ex) {
        // Thread was interrupted during sleep or wait;
    } finally {
        //cleanup, if required;
    }
    // exiting the run method terminates the thread
}

如果在线程调用sleep方法后,isInterrupted检测没有必要也没用。如果在中断状态调用sleep方法,它也不会休眠。相反,它将清除这一状态并抛出InterruptedException。

 

二,线程状态

  • New(新创建)
  • Runnable(可运行)
  • Blocked(被阻塞)
  • Waiting(等待)
  • Timed waiting(计时等待)
  • Terminated(被终止)

 

1,新创建线程

  new Thread(r), 当一个线程处于新建状态时,程序还没有开始运行线程中的代码。

2,可运行线程

  一旦调用start方法,线程处于runnable状态。一个可运行的线程可能正在运行也可能没有运行。

一旦一个线程开始运行,它不必始终保持运行。抢占式调度系统给每一个可运行线程一个时间片来执行任务,当时间片用完,操作系统剥夺该线程的运行权,并给另一个线程运行机会。

3,被阻塞线程和等待线程

  当线程处于被阻塞或等待状态时,它暂时不活动。

  进入被阻塞或等待状态的情况:

  •   当一个线程试图获取一个内部的对象锁,而该锁被其他线程持有,则该线程进入阻塞状态。当所有其他线程释放该锁,并且线程调度器允许该线程持有这把锁时,该线程将变成非阻塞状态。
  •       When the thread waits for another thread to notify the scheduler of a condition, it enters the waiting state.
  •   有一些方法有一个超时参数,调用它们导致线程进入计时等待状态。这一状态将一直保持到超时期满或者接收到适当的通知。这些方法有:Thread.sleep(), Object.wait(), Thread.join(), Lock.tryLock以及Condition.await()

技术分享

 

《Java核心技术》---- 多线程