java多線程

  多線程也稱作“併發”,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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章