多線程實例
阿新 • • 發佈:2017-09-27
通過 microsoft 需要 soft span 解決 interrupt src mil
多線程案例
一個模擬的買票系統,使用num表示車票的數量:
1 public class TicketCounter implements Runnable{ 2 private int num = 5; 3 @Override 4 public void run() { 5 //因為while(true)所以可以多次執行直到num = 0; 6 while(true){ 7 if(num > 0){ 8 System.out.println(Thread.currentThread().getName() + ":" + num--);9 } 10 } 11 12 } 13 14 public static void main(String[] args) { 15 /** 16 * 使用通過一個target,可以共享資源 17 */ 18 TicketCounter counter = new TicketCounter(); 19 new Thread(counter, "1號").start(); 20 new Thread(counter, "2號").start();21 new Thread(counter, "3號").start(); 22 } 23 24 }
運行結果:
使用Thread.sleep()進行延時:
1 public class TicketCounter2 implements Runnable{ 2 private int num = 5; 3 4 @Override 5 public void run() { 6 7 while(true){ 8 9 if(num > 0){ 10 try { 11 Thread.sleep(1000); 12 } catch (InterruptedException e) {13 e.printStackTrace(); 14 } 15 System.out.println(Thread.currentThread().getName() + ":" + num--); 16 } 17 } 18 } 19 20 public static void main(String[] args) { 21 TicketCounter2 counter = new TicketCounter2(); 22 new Thread(counter, "1號").start(); 23 new Thread(counter, "2號").start(); 24 new Thread(counter, "3號").start(); 25 } 26 }
運行結果:
通過上述結果發現這個系統出現負數,明顯得看出運行錯誤。
如果想解決這種問題,就需要使用同步。所謂同步就是在統一時間段中只有有一個線程運行,
其他的線程必須等到這個線程結束之後才能繼續執行。
同步
同步方法1:
【同步代碼塊】:
語法格式:
synchronized(同步對象){
//需要同步的代碼
}
public class TicketCounter2 implements Runnable{ private int num = 5; @Override public void run() { while(true){ synchronized (this) { if(num > 0){ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + ":" + num--); } } } } public static void main(String[] args) { TicketCounter2 counter = new TicketCounter2(); new Thread(counter, "1號").start(); new Thread(counter, "2號").start(); new Thread(counter, "3號").start(); } }
運行結果:
同步方法2:采用同步方法。
public class TicketCounter2 implements Runnable{ private int num = 5; @Override public void run() { while(true){ sale(); } } public synchronized void sale(){ if(num > 0){ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + ":" + num--); } } public static void main(String[] args) { TicketCounter2 counter = new TicketCounter2(); new Thread(counter, "1號").start(); new Thread(counter, "2號").start(); new Thread(counter, "3號").start(); } }
運行結果:
本文引用:資訊《Java多線程總結》,一起來圍觀吧
http://ms.csdn.net/geek/238191
多線程實例