1. 程式人生 > >Java多執行緒之 Thread VS Runnable 【帶案例】

Java多執行緒之 Thread VS Runnable 【帶案例】


為此,我們舉個例子,假設有火車站三個視窗,在賣火車票,總共只有5張票。每一個執行緒相當於一個視窗,分別售票

<strong>package com.thread;

class myThread extends Thread{
	
	private int ticketsCount=5;//一種有5張票
	private String name;//視窗,也即是執行緒的名字
	
	public myThread(String name){
		this.name=name;
	}

	@Override
	public void run() {
		while(ticketsCount>0) {
			//ticketsCount--;//如果還有票,就賣掉一張
			System.out.println(name+"有"+ticketsCount+"張票,賣了1一張票,剩餘票數為:"+ --ticketsCount);
			//System.out.println(name+"賣了1一張票,剩餘票數為:"+ticketsCount);
		}
	}

	
	
}
public class TicketsTread {

		public static void main(String args[]) {
			//建立三個執行緒,模擬三個視窗賣票
			myThread t1=new myThread("視窗1");
			myThread t2=new myThread("視窗2");
			myThread t3=new myThread("視窗3");
			
			//啟動這三個執行緒,也即是視窗開始賣票
			t1.start();
			t2.start();
			t3.start();
		}
}

</strong>

輸出為:

這樣的結果說明了,每個視窗(執行緒)都賣了5張票,這是因為建立了3個Thread物件,每個物件有自己的成員例項變數。

因為每個執行緒,mt1,mt2,mt3分別是一個繼承了Thread類的一個物件,所以物件擁有其所屬類的私有或共有的成員變數或者成員方法,也就是說他們的變數,也即是票數ticketCount都是每個物件“自己”私有的,“各自為營”,資源並不是共享的。 那麼,你就會看到,每個視窗都有5張票的情況咯。。

再使用runnable 來實現這個示例。

package com.thread;

class myThread_Runnable implements Runnable{
	private int ticketsCount=5;//一種有5張票
	
	public void run() {//如果給run方法加鎖,那麼會出現一個視窗會賣光所有票的現象
		while(ticketsCount>0) {
			ticketsCount--;//如果還有票,就賣掉一張
			System.out.println(Thread.currentThread().getName()+"賣了1一張票,剩餘票數為:"+ticketsCount);
		}
	}

}

public class TicketsRunnable {
	
		public static void main(String args[]){
			myThread_Runnable mt=new myThread_Runnable();
			//建立三個執行緒,來模擬三個售票視窗
			Thread t1=new Thread(mt,"視窗1");
			Thread t2=new Thread(mt,"視窗2");
			Thread t3=new Thread(mt,"視窗3");
			
			//啟動這三個執行緒,也即是三個視窗,開始賣票
			t1.start();
			t2.start();
			t3.start();
		}
}

上面這個是一個及其特殊的情況,執行緒(視窗)1一次性的使用了CPU並執行完了了run方法的所有程式碼,然後程序結束。

下面這個是一般性的結果:

上面這個輸出就可以看出來,執行緒資源搶奪所導致的交叉執行。