多線程也稱作“併發”,java中實現線程有兩種方式:
1,繼承Thread類
2,實現Runnable接口
下面寫賣車票例題,分別使用兩種方法
Thread:
public class ticket extends Thread { int count = 100; public void run(){ for(int i=count;i>0;i--){ System.out.println(Thread.currentThread().getName()+"賣出第"+i+"張車票"); } } }
public static void main(String[] args) { // TODO Auto-generated method stub ticket t = new ticket(); //創建線程對象 //創建4個線程,分別調用線程對象t啓動 new Thread(t,"窗口1").start(); new Thread(t,"窗口2").start(); new Thread(t,"窗口3").start(); new Thread(t,"窗口4").start(); }
運行結果,並沒有達到預期的四個窗口賣共同的100張票的效果,而是每個窗口分別賣了100張票,這是由於創建了四個線程,而每個線程又調用了線程對象t,就等於創建了四個資源,創造了400張票。
再看看用Runnable接口:
public class ticket2 implements Runnable { int count = 100; public void run() { // TODO Auto-generated method stub for(;;){ try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } if(count >= 0){ maipiao(); }else{ break; } } } /** * 方法鎖 */ public synchronized void maipiao(){ count --;//賣出一張票 if(count >= 0){ System.out.println(Thread.currentThread().getName()+"賣出一張票,現剩餘"+count+"張票!"); } } }
public static void main(String[] args) { // TODO Auto-generated method stub ticket2 t = new ticket2(); new Thread(t, "窗口1").start(); new Thread(t, "窗口2").start(); new Thread(t, "窗口3").start(); new Thread(t, "窗口4").start(); }
運行結果,因爲添加了方法鎖和睡眠時間,可以很清楚地看到,100張票分別被4個窗口賣掉。這裏創建了4個線程,每個線程都調用的同一個ticket2對象中的run()方法,訪問的是同一個變量count。