isInterrupted()和interrputed()方法的區別
isInterrupted方法是執行個體方法,interrupted方法是靜態方法。
Thread.currentThread().isInterrupted()
Thread.interrupted()
首先說明:wait(),notify(),notifyAll()這些方法由java.lang.Object 類提供,而上面講到的方法都是由java.lang.Thread 類提供(Thread類實現了Runnable 介面)。wait(),notify(),notifyAll()這三個方法用於協調多個線程對共用資料的存取,所以必須在synchronized 語句塊內使用這三個方法。先看下面了例子:
樣本12:
public class ThreadTest implements Runnable{
public static int shareVar = 0;
public synchronized void run(){
if(shareVar == 0){
for(int i=0;i<10;i++){
shareVar++ ;
if(shareVar == 5){
try{
this.wait();
}catch(Exception e){}
}} }
if(shareVar != 0){
System.out.print(Thread.currentThread().getName());
System.out.println(" shareVar = " + shareVar);
this.notify();
}
}
public static void main(String[] args){
Runnable r = new ThreadTest();
Thread t1 = new Thread(r,"t1");
Thread t2 = new Thread(r,"t2");
t1.start();
t2.start();
}}
運行結果:
t2 shareVar = 5
t1 shareVar = 10
t1線程最先執行。由於初始狀態下shareVar 為0,t1 將使shareVar 連續加1,當shareVar的值為5 時,t1 調用wait()方法,t1 將處於休息狀態,同時釋放鎖標誌。這時t2 得到了鎖標誌開始執行,shareVar 的值已經變為5,所以t2 直接輸出shareVar 的值,然後再調用notify() 方法喚醒t1。t1 接著上次休息前的進度繼續執行,把shareVar 的值一直加到10,由於此刻shareVar 的值不為0,所以t1 將輸出此刻shareVar的值,然後再調用notify()方法,由於此刻已經沒有等待鎖標誌的線程,所以此調用語句不起任何作用。