自学多线程-3

2023-01-31 02:01:39 多线程 自学

中断线程的运行:

当一个线程运行时,另一个线程可以调用对应的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.     public static void main(String[] args) throws Exception {  
  25.         // TODO Auto-generated method stub  
  26.         Kirl k1 = new Kirl();  
  27.         Thread t1 = new Thread(k1,"Kirl");  
  28.         System.out.println("Kirl start");  
  29.         t1.start();  
  30.         System.out.println("Main sleep");  
  31.         try {  
  32.             Thread.sleep(3000);  
  33.         } catch (Exception e) {  
  34.             // TODO: handle exception  
  35.         }  
  36.         System.out.println("Main block start");  
  37.         t1.interrupt();  
  38.         System.out.println("Main quit");  
  39.     }  

运行结果如下:

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.     public static void main(String[] args) throws Exception {  
  4.         // TODO Auto-generated method stub  
  5.         Thread t = Thread.currentThread();  
  6.         System.out.println("Time1:" + t.isInterrupted());  
  7.         t.interrupt();  
  8.         System.out.println("Time2:" + t.isInterrupted());  
  9.         System.out.println("Time3:" + t.isInterrupted());  
  10.         try 
  11.         {  
  12.             Thread.sleep(2000);  
  13.             System.out.println("Interrupted failed!");  
  14.         }catch(Exception e)  
  15.         {  
  16.             System.out.println("Interrupted success!");  
  17.         }  
  18.         System.out.println("Time4:" + t.isInterrupted());  
  19.     }  

运行结果如下:

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.     public static void main(String[] args) throws Exception {  
  26.         // TODO Auto-generated method stub  
  27.         Kirl k = new Kirl();  
  28.         Thread t1 = new Thread(k,"Thread1");  
  29.         Thread t2 = new Thread(k,"Thread2");  
  30.         Thread t3 = new Thread(k,"Thread3");  
  31.         t1.start();  
  32.         t2.start();  
  33.         t3.start();  
  34.     }  

运行结果如下:

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

运行结果如下:

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

由结果分析可知,实现了多线程的同步功能,多个代售点功能卖票。

相关文章