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()
时间: 2024-10-20 04:19:57