JAVA线程的interrupt
生活随笔
收集整理的這篇文章主要介紹了
JAVA线程的interrupt
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
interrupt()只是改變中斷狀態而已.?interrupt()不會中斷一個正在運行的線程。這一方法實際上完成的是,給受阻塞的線程拋出一個中斷信號,
????這樣受阻線程就得以退出阻塞的狀態。更確切?的說,如果線程被Object.wait,?Thread.join和Thread.sleep三種方法之一阻塞,????那么,它將接收到一個中斷異常(InterruptedException),從而提早地終結被阻塞狀態。
????如果線程沒有被阻塞,這時調用interrupt()將不起作用;否則,線程就將得到InterruptedException異常(該線程必須事先預備好處理此狀況),接著逃離阻塞狀態。
????線程A在執行sleep,wait,join時,線程B調用線程A的interrupt方法,的確這一個時候A會有InterruptedException?異常拋出來.
????但這其實是在sleep,wait,join這些方法內部會不斷檢查中斷狀態的值,而自己拋出的InterruptedException。
????如果線程A正在執行一些指定的操作時如賦值,for,while,if,調用方法等,都不會去檢查中斷狀態
????,所以線程A不會拋出?InterruptedException,而會一直執行著自己的操作.
????當線程A終于執行到wait(),sleep(),join()時,才馬上會拋出?InterruptedException.
????若沒有調用sleep(),wait(),join()這些方法,即沒有在線程里自己檢查中斷狀態自己拋出InterruptedException的?話,
????那InterruptedException是不會被拋出來的.?
????????具體使用見實例1,實例2。
注意1:當線程A執行到wait(),sleep(),join()時,拋出InterruptedException后,中斷狀態已經被系統復位了,
線程A調用Thread.interrupted()返回的是false
????線程A正在使用sleep()暫停著:?Thread.sleep(100000);
????如果要取消他的等待狀態,可以在正在執行的線程里(比如這里是B)調用
????????a.interrupt();
????令線程A放棄睡眠操作,這里a是線程A對應到的Thread實例
????當在sleep中時 線程被調用interrupt()時,就馬上會放棄暫停的狀態.并拋出InterruptedException.丟出異常的,是A線程.
2.?wait()?&?interrupt()
????線程A調用了wait()進入了等待狀態,也可以用interrupt()取消.
????不過這時候要小心鎖定的問題.線程在進入等待區,會把鎖定解除,當對等待中的線程調用interrupt()時
????,會先重新獲取鎖定,再拋出異常.在獲取鎖定之前,是無法拋出異常的.
3.?join()?&?interrupt()
????當線程以join()等待其他線程結束時,當它被調用interrupt(),它與sleep()時一樣,?會馬上跳到catch塊里.?
????注意,是對誰調用interrupt()方法,一定是調用被阻塞線程的interrupt方法.如在線程a中調用來線程t.join().
????則a會等t執行完后在執行t.join后的代碼,當在線程b中調用來?a.interrupt()方法,則會拋出InterruptedException,當然join()也就被取消了。
實例1:
????static?void?interruptDemo()
????{
????????Thread?t1=new?Thread(new?InterruptDemoRunnable(),"first");
????????Thread?t2=new?Thread(new?InterruptDemoRunnable(t1),"second");
????????t1.start();
????????t2.start();
????}
class?InterruptDemoRunnable?implements?Runnable
{
????long?id=0;
????static?long?count=0;
????Thread?t;
????InterruptDemoRunnable()
????{
????????this(null);
????}
????InterruptDemoRunnable(Thread?t)
????{
????????id=count++;
????????this.t=t;
????}
????boolean?blRun=true;
????public?void?run()
????{????int?cnt=0;
????????while(blRun)
????????{
????????????if(t!=null)
????????????{
????????????????if(cnt==2)
????????????????{
????????????????????t.interrupt();
????????????????????if(t.isInterrupted())
????????????????????????System.out.println("set?the?thread?"+t.getName()+"?to?be?Interrupted");
????????????????}
????????????????????
????????????}
????????????else
????????????{????
????????????????try
????????????????{
????????????????????Thread.sleep(1000);
????????????????}
????????????????catch(InterruptedException?e)
????????????????{
????????????????????System.out.println("First?Interrupted?when?sleep");
????????????????????System.out.println(?"Interrupted?is?"+Thread.interrupted());//@1
????????????????}
????????????????try
????????????????{
????????????????????Thread.sleep(1);
????????????????}
????????????????catch(InterruptedException?e)
????????????????{
????????????????????System.out.println("second?Interrupted?when?sleep");
????????????????}
????????????}
????????????System.out.println(id+"run"+cnt);
????????????cnt++;
????????????if(cnt==5)
????????????{
????????????????blRun=false;????????????
????????????}
????????}
????????????System.out.println("thread:"+id+"exit");
????}
}
注意1:當線程A執行到wait(),sleep(),join()時,拋出InterruptedException后,中斷狀態已經被系統復位了。
線程AThread.interrupted()返回的是false
實例2:
????static?void?interruptDemo()
????{
????????Thread?t1=new?InterruptDemoThread();
????????t1.setName("t1");
????????Thread?t2=new?InterruptDemoThread(t1);
????????t1.setName("t2");
????????t1.start();
????????t2.start();
????}
class?InterruptDemoThread?extends?Thread
{
????long?id=0;
????static?long?count=0;
????Thread?t;
????InterruptDemoThread()
????{
????????this(null);
????}
????InterruptDemoThread(Thread?t)
????{
????????id=count++;
????????this.t=t;
????}
????boolean?blRun=true;
????public?void?run()
????{????int?cnt=0;
????????while(blRun)
????????{
????????????if(t!=null)
????????????{
????????????????if(cnt==2)
????????????????{
????????????????????t.interrupt();
????????????????????if(t.isInterrupted())
????????????????????????System.out.println("set?the?thread?"+t.getName()+"?to?be?Interrupted");
????????????????}
????????????????????
????????????}
????????????else?if(isInterrupted())@1
????????????{????
????????????????/*Thread.interrupted();//@2
????????????????System.out.println("after?interrupted(),the?state?of?Interrupted?is?"+isInterrupted());*/
????????????????try{
????????????????????Thread.sleep(1);
????????????????}
????????????????catch(InterruptedException?e)
????????????????{
????????????????????System.out.println("Interrupted?when?sleep");
????????????????????System.out.println(?"Interrupted?is?"+Thread.interrupted());
????????????????}
????????????}
????????????Thread.yield();
????????????System.out.println(id+"run"+cnt);
????????????cnt++;
????????????if(cnt==5)
????????????{
????????????????blRun=false;????????????
????????????}
????????}
????????????System.out.println("thread:"+id+"exit");
????}
}
注意1:如果線程被調用了interrupt(),那么如果此次該線程并不在wait(),sleep(),join()時,
下次執行wait(),sleep(),join()時,一樣會拋出InterruptedException,當然拋出后該線程的中斷狀態也回被系統復位。
注意2:我們可以手動的使用Thread.interrupted()來使當前線程的中斷狀態系統復位(即清除中斷狀態)
????如果線程沒有被阻塞,這時調用interrupt()將不起作用;否則,線程就將得到InterruptedException異常(該線程必須事先預備好處理此狀況),接著逃離阻塞狀態。
????線程A在執行sleep,wait,join時,線程B調用線程A的interrupt方法,的確這一個時候A會有InterruptedException?異常拋出來.
????但這其實是在sleep,wait,join這些方法內部會不斷檢查中斷狀態的值,而自己拋出的InterruptedException。
????如果線程A正在執行一些指定的操作時如賦值,for,while,if,調用方法等,都不會去檢查中斷狀態
????,所以線程A不會拋出?InterruptedException,而會一直執行著自己的操作.
????當線程A終于執行到wait(),sleep(),join()時,才馬上會拋出?InterruptedException.
????若沒有調用sleep(),wait(),join()這些方法,即沒有在線程里自己檢查中斷狀態自己拋出InterruptedException的?話,
????那InterruptedException是不會被拋出來的.?
????????具體使用見實例1,實例2。
注意1:當線程A執行到wait(),sleep(),join()時,拋出InterruptedException后,中斷狀態已經被系統復位了,
線程A調用Thread.interrupted()返回的是false
public static boolean?interrupted?()
Since:?API Level 1Returns a?boolean?indicating whether the current Thread (?currentThread()) has a pending interrupt request (?true) or not (false). It also has the side-effect of clearing the flag.
Returns
- a?boolean?indicating the interrupt status
public boolean?isInterrupted?()
Since:?API Level 1Returns a?boolean?indicating whether the receiver has a pending interrupt request (true) or not (?false)
Returns
- a?boolean?indicating the interrupt status
????線程A正在使用sleep()暫停著:?Thread.sleep(100000);
????如果要取消他的等待狀態,可以在正在執行的線程里(比如這里是B)調用
????????a.interrupt();
????令線程A放棄睡眠操作,這里a是線程A對應到的Thread實例
????當在sleep中時 線程被調用interrupt()時,就馬上會放棄暫停的狀態.并拋出InterruptedException.丟出異常的,是A線程.
2.?wait()?&?interrupt()
????線程A調用了wait()進入了等待狀態,也可以用interrupt()取消.
????不過這時候要小心鎖定的問題.線程在進入等待區,會把鎖定解除,當對等待中的線程調用interrupt()時
????,會先重新獲取鎖定,再拋出異常.在獲取鎖定之前,是無法拋出異常的.
3.?join()?&?interrupt()
????當線程以join()等待其他線程結束時,當它被調用interrupt(),它與sleep()時一樣,?會馬上跳到catch塊里.?
????注意,是對誰調用interrupt()方法,一定是調用被阻塞線程的interrupt方法.如在線程a中調用來線程t.join().
????則a會等t執行完后在執行t.join后的代碼,當在線程b中調用來?a.interrupt()方法,則會拋出InterruptedException,當然join()也就被取消了。
實例1:
????static?void?interruptDemo()
????{
????????Thread?t1=new?Thread(new?InterruptDemoRunnable(),"first");
????????Thread?t2=new?Thread(new?InterruptDemoRunnable(t1),"second");
????????t1.start();
????????t2.start();
????}
class?InterruptDemoRunnable?implements?Runnable
{
????long?id=0;
????static?long?count=0;
????Thread?t;
????InterruptDemoRunnable()
????{
????????this(null);
????}
????InterruptDemoRunnable(Thread?t)
????{
????????id=count++;
????????this.t=t;
????}
????boolean?blRun=true;
????public?void?run()
????{????int?cnt=0;
????????while(blRun)
????????{
????????????if(t!=null)
????????????{
????????????????if(cnt==2)
????????????????{
????????????????????t.interrupt();
????????????????????if(t.isInterrupted())
????????????????????????System.out.println("set?the?thread?"+t.getName()+"?to?be?Interrupted");
????????????????}
????????????????????
????????????}
????????????else
????????????{????
????????????????try
????????????????{
????????????????????Thread.sleep(1000);
????????????????}
????????????????catch(InterruptedException?e)
????????????????{
????????????????????System.out.println("First?Interrupted?when?sleep");
????????????????????System.out.println(?"Interrupted?is?"+Thread.interrupted());//@1
????????????????}
????????????????try
????????????????{
????????????????????Thread.sleep(1);
????????????????}
????????????????catch(InterruptedException?e)
????????????????{
????????????????????System.out.println("second?Interrupted?when?sleep");
????????????????}
????????????}
????????????System.out.println(id+"run"+cnt);
????????????cnt++;
????????????if(cnt==5)
????????????{
????????????????blRun=false;????????????
????????????}
????????}
????????????System.out.println("thread:"+id+"exit");
????}
}
注意1:當線程A執行到wait(),sleep(),join()時,拋出InterruptedException后,中斷狀態已經被系統復位了。
線程AThread.interrupted()返回的是false
實例2:
????static?void?interruptDemo()
????{
????????Thread?t1=new?InterruptDemoThread();
????????t1.setName("t1");
????????Thread?t2=new?InterruptDemoThread(t1);
????????t1.setName("t2");
????????t1.start();
????????t2.start();
????}
class?InterruptDemoThread?extends?Thread
{
????long?id=0;
????static?long?count=0;
????Thread?t;
????InterruptDemoThread()
????{
????????this(null);
????}
????InterruptDemoThread(Thread?t)
????{
????????id=count++;
????????this.t=t;
????}
????boolean?blRun=true;
????public?void?run()
????{????int?cnt=0;
????????while(blRun)
????????{
????????????if(t!=null)
????????????{
????????????????if(cnt==2)
????????????????{
????????????????????t.interrupt();
????????????????????if(t.isInterrupted())
????????????????????????System.out.println("set?the?thread?"+t.getName()+"?to?be?Interrupted");
????????????????}
????????????????????
????????????}
????????????else?if(isInterrupted())@1
????????????{????
????????????????/*Thread.interrupted();//@2
????????????????System.out.println("after?interrupted(),the?state?of?Interrupted?is?"+isInterrupted());*/
????????????????try{
????????????????????Thread.sleep(1);
????????????????}
????????????????catch(InterruptedException?e)
????????????????{
????????????????????System.out.println("Interrupted?when?sleep");
????????????????????System.out.println(?"Interrupted?is?"+Thread.interrupted());
????????????????}
????????????}
????????????Thread.yield();
????????????System.out.println(id+"run"+cnt);
????????????cnt++;
????????????if(cnt==5)
????????????{
????????????????blRun=false;????????????
????????????}
????????}
????????????System.out.println("thread:"+id+"exit");
????}
}
注意1:如果線程被調用了interrupt(),那么如果此次該線程并不在wait(),sleep(),join()時,
下次執行wait(),sleep(),join()時,一樣會拋出InterruptedException,當然拋出后該線程的中斷狀態也回被系統復位。
注意2:我們可以手動的使用Thread.interrupted()來使當前線程的中斷狀態系統復位(即清除中斷狀態)
總結
以上是生活随笔為你收集整理的JAVA线程的interrupt的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Qt教程] 第24篇 数据库(四)SQ
- 下一篇: 如何中断JAVA线程