中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

自學多線程-3

發布時間:2020-06-19 12:19:58 來源:網絡 閱讀:821 作者:KIRL 欄目:開發技術

中斷線程的運行:

當一個線程運行時,另一個線程可以調用對應的Thread對象的interrupt()方法來中斷它。

代碼示例如下:

  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.     }  

運行結果如下:

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

由以上結果可知,當Thread1線程執行過程中,Main線程發出中斷Thread1線程的命令,則Thread1線程被中斷,拋出異常。

查看線程的中斷狀態:

可以在Thread對象上調用isInterrupted()方法來檢查任何線程的中斷狀態。

示例代碼如下:

  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.     }  

運行結果如下:

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

由以上結果可知,線程如果中斷之后再休眠,則會清除中斷標志。

多線程的同步問題:

代碼示例如下:

  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.     }  

運行結果如下:

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

由以上結果可知,雖然實現了多線程共享資源的問題,但只有一個線程在執行,故并不是真正的實現了多線程的同步功能。即只有一個代售點在售票。

  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.     }  

運行結果如下:

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

由結果分析可知,實現了多線程的同步功能,多個代售點功能賣票。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

丹寨县| 华坪县| 神木县| 长沙市| 全椒县| 蓬安县| 金昌市| 措勤县| 泸西县| 松潘县| 荆门市| 宁强县| 鹤峰县| 凌源市| 乌恰县| 麻江县| 石首市| 河间市| 稻城县| 维西| 玛沁县| 安阳市| 潞城市| 衡东县| 恭城| 大同县| 奉化市| 宁国市| 绥棱县| 临朐县| 双桥区| 灵山县| 长葛市| 连州市| 章丘市| 监利县| 南通市| 普兰店市| 南澳县| 方正县| 财经|