多線程也稱做「併發」,java中實現線程有兩種方式:java
1,繼承Thread類多線程
2,實現Runnable接口併發
下面寫賣車票例題,分別使用兩種方法ide
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。接口