區分interupt()和 notify().

來源:互聯網
上載者:User

 

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()方法,由於此刻已經沒有等待鎖標誌的線程,所以此調用語句不起任何作用。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.