溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

自學(xué)多線程-3

發(fā)布時(shí)間:2020-06-19 12:19:58 來(lái)源:網(wǎng)絡(luò) 閱讀:820 作者:KIRL 欄目:開發(fā)技術(shù)

中斷線程的運(yùn)行:

當(dāng)一個(gè)線程運(yùn)行時(shí),另一個(gè)線程可以調(diào)用對(duì)應(yīng)的Thread對(duì)象的interrupt()方法來(lái)中斷它。

代碼示例如下:

  1. class Kirl implements Runnable  
  2. {  
  3.     public void printText()  
  4.     {  
  5.         System.out.println("Thread1 start sleep");  
  6.         try 
  7.         {  
  8.             Thread.sleep(5000);  
  9.         }  
  10.         catch(Exception e)  
  11.         {  
  12.             System.out.println("Thread1 block");  
  13.             return;  
  14.         }  
  15.         System.out.println("Thread1 quit");  
  16.     }  
  17.     public void run()  
  18.     {  
  19.         printText();  
  20.     }  
  21. }  
  22. public class TestThread {  
  23.     /**  
  24.      * @param args  
  25.      * @throws Exception   
  26.      */ 
  27.     public static void main(String[] args) throws Exception {  
  28.         // TODO Auto-generated method stub  
  29.         Kirl k1 = new Kirl();  
  30.         Thread t1 = new Thread(k1,"Kirl");  
  31.         System.out.println("Kirl start");  
  32.         t1.start();  
  33.         System.out.println("Main sleep");  
  34.         try {  
  35.             Thread.sleep(3000);  
  36.         } catch (Exception e) {  
  37.             // TODO: handle exception  
  38.         }  
  39.         System.out.println("Main block start");  
  40.         t1.interrupt();  
  41.         System.out.println("Main quit");  
  42.     }  

運(yùn)行結(jié)果如下:

Kirl start
Main sleep
Thread1 start sleep
Main block start
Main quit
Thread1 block

由以上結(jié)果可知,當(dāng)Thread1線程執(zhí)行過(guò)程中,Main線程發(fā)出中斷Thread1線程的命令,則Thread1線程被中斷,拋出異常。

查看線程的中斷狀態(tài):

可以在Thread對(duì)象上調(diào)用isInterrupted()方法來(lái)檢查任何線程的中斷狀態(tài)。

示例代碼如下:

  1. public class TestThread {  
  2.     /**  
  3.      * @param args  
  4.      * @throws Exception   
  5.      */ 
  6.     public static void main(String[] args) throws Exception {  
  7.         // TODO Auto-generated method stub  
  8.         Thread t = Thread.currentThread();  
  9.         System.out.println("Time1:" + t.isInterrupted());  
  10.         t.interrupt();  
  11.         System.out.println("Time2:" + t.isInterrupted());  
  12.         System.out.println("Time3:" + t.isInterrupted());  
  13.         try 
  14.         {  
  15.             Thread.sleep(2000);  
  16.             System.out.println("Interrupted failed!");  
  17.         }catch(Exception e)  
  18.         {  
  19.             System.out.println("Interrupted success!");  
  20.         }  
  21.         System.out.println("Time4:" + t.isInterrupted());  
  22.     }  

運(yùn)行結(jié)果如下:

Time1:false
Time2:true
Time3:true
Interrupted success!
Time4:false

由以上結(jié)果可知,線程如果中斷之后再休眠,則會(huì)清除中斷標(biāo)志。

多線程的同步問(wèn)題:

代碼示例如下:

  1. class Kirl implements Runnable  
  2. {  
  3.     private int ticket = 7;  
  4.     public synchronized void sell()  
  5.     {  
  6.         while(ticket > 0)  
  7.         {  
  8.             try {  
  9.                 Thread.sleep(100);  
  10.             } catch (InterruptedException e) {  
  11.                 // TODO Auto-generated catch block  
  12.                 e.printStackTrace();  
  13.             }  
  14.             System.out.println(Thread.currentThread().getName() + "->" + ticket--);  
  15.         }  
  16.     }  
  17.     public void run()  
  18.     {  
  19.         this.sell();  
  20.     }  
  21. }  
  22. public class TestThread {  
  23.  
  24.     /**  
  25.      * @param args  
  26.      * @throws Exception   
  27.      */ 
  28.     public static void main(String[] args) throws Exception {  
  29.         // TODO Auto-generated method stub  
  30.         Kirl k = new Kirl();  
  31.         Thread t1 = new Thread(k,"Thread1");  
  32.         Thread t2 = new Thread(k,"Thread2");  
  33.         Thread t3 = new Thread(k,"Thread3");  
  34.         t1.start();  
  35.         t2.start();  
  36.         t3.start();  
  37.     }  

運(yùn)行結(jié)果如下:

Thread1->7
Thread1->6
Thread1->5
Thread1->4
Thread1->3
Thread1->2
Thread1->1

由以上結(jié)果可知,雖然實(shí)現(xiàn)了多線程共享資源的問(wèn)題,但只有一個(gè)線程在執(zhí)行,故并不是真正的實(shí)現(xiàn)了多線程的同步功能。即只有一個(gè)代售點(diǎn)在售票。

  1. class Kirl implements Runnable  
  2. {  
  3.     private int ticket = 7;  
  4.     public void sell()  
  5.     {  
  6.         while(ticket > 0)  
  7.         {  
  8.             synchronized (this) {  
  9.                 if(this.ticket > 0){  
  10.                 try {  
  11.                     Thread.sleep(100);  
  12.                 } catch (InterruptedException e) {  
  13.                     // TODO Auto-generated catch block  
  14.                     e.printStackTrace();  
  15.                 }  
  16.                 System.out.println(Thread.currentThread().getName() + "->" + ticket--);  
  17.                 }  
  18.             }  
  19.         }  
  20.     }  
  21.     public void run()  
  22.     {  
  23.         this.sell();  
  24.     }  
  25. }  
  26. public class TestThread {  
  27.     /**  
  28.      * @param args  
  29.      * @throws Exception   
  30.      */ 
  31.     public static void main(String[] args) throws Exception {  
  32.         // TODO Auto-generated method stub  
  33.         Kirl k = new Kirl();  
  34.         Thread t1 = new Thread(k,"Thread1");  
  35.         Thread t2 = new Thread(k,"Thread2");  
  36.         Thread t3 = new Thread(k,"Thread3");  
  37.         t1.start();  
  38.         t2.start();  
  39.         t3.start();  
  40.     }  

運(yùn)行結(jié)果如下:

Thread2->7
Thread2->6
Thread3->5
Thread3->4
Thread3->3
Thread1->2
Thread1->1

由結(jié)果分析可知,實(shí)現(xiàn)了多線程的同步功能,多個(gè)代售點(diǎn)功能賣票。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI