* 實現方式和繼承方式有什麼區別呢?
 *         區別:
 *                 繼承Thread:執行緒程式碼存放在Thread子類run方法中
 *                 實現Runnable:執行緒程式碼存放在介面的子類的run方法中
 *
 *         實現方式的好處:避免了單繼承的侷限性
 *         在定義執行緒時,建議使用實現方式,當然如果一個類沒有繼承父類,那麼也可以通過繼承Thread類來實現多執行緒
 *
 * 注意:Runnable介面沒有丟擲異常,那麼實現它的類只能是try-catch不能throws
 * Java對多執行緒的安全問題提供了專業的解決方式就是同步程式碼塊synchronized(物件){需要同步的程式碼}
 *
 * 同步的前提:
 *         1.有2個及以上的執行緒
 *         2.多個執行緒使用用一個鎖(物件)
 *     同步的好處:解決了多執行緒的安全問題

 * 同步的弊端:多個執行緒需要判斷鎖,較為消耗資源

package 多執行緒;

class Ticket implements Runnable
{
//	private static int tick = 100;
	private int tick=100;
	Object obj = new Object();//建立一個物件或者自己重新寫一個類來建立一個物件下面同步關鍵字需要用到
	@Override
	public void run() 
	{
		while(true)
		{
			synchronized(obj)
//			synchronized(this)
			{
			if(tick>0){
				try {Thread.sleep(10);} catch (Exception e) {	}
				System.out.println(Thread.currentThread().getName()+"...銷售:"+(tick--)+"號票");
//				tick--;
			}else {
				break;
			}
			}
		}
	}
	
}
public class Test 
{
	public static void main(String[] args) 
	{
		Ticket t = new Ticket();//建立一個實現了Runnable介面的類
		
		//建立4個多執行緒物件並傳遞上面介面物件給其構造方法
		Thread t1 = new Thread(t);//建立了一個執行緒
		Thread t2 = new Thread(t);//建立了一個執行緒
		Thread t3 = new Thread(t);//建立了一個執行緒
		Thread t4 = new Thread(t);//建立了一個執行緒
		
		//開啟執行緒
		t1.start();
		t2.start();
		t3.start();
		t4.start();
	}
}