runable和thread的區別

  使用runable進行測試:

class MyRunnable implements Runnable{
   private int ticket=10;
   public void run(){
	   for(int i=0;i<20;i++)
	   {
		   if(this.ticket>0){
			   System.out.println("賣票:ticket"+this.ticket--);
	      }
       }
   }
}
測試類:

public class ThreadDemo01{
	public static void main(String[] args) {
		    MyRunnable  r1=new MyRunnable();
			Thread t1=new Thread(r1);
			Thread t2=new Thread(r1);
			t1.start();
			t2.start();
	}
}

2個線程,一共賣出10張票:

賣票:ticket10
賣票:ticket9
賣票:ticket7
賣票:ticket6
賣票:ticket5
賣票:ticket4
賣票:ticket3
賣票:ticket2
賣票:ticket1
賣票:ticket8

使用Thread進行測試:

class MyThread extends Thread{
	   private int ticket=10;
	   public void run(){
		   for(int i=0;i<20;i++)
		   {
			   if(this.ticket>0){
				   System.out.println("賣票:ticket"+this.ticket--);
		      }
	       }
	   }
}

public class ThreadDemo02{
	public static void main(String[] args) {
		    MyThread mt=new MyThread();
			Thread t1=new Thread(mt);
			Thread t2=new Thread(mt);
			t1.start();
			t2.start();
	}
}
2個線程,依然賣出10張票

賣票:ticket10
賣票:ticket9
賣票:ticket8
賣票:ticket7
賣票:ticket6
賣票:ticket5
賣票:ticket4
賣票:ticket3
賣票:ticket2
賣票:ticket1
           總結:個人認爲繼承thread類和實現runnable接口,能達到同樣的效果。唯一區別是,實現接口更靈活,繼承只能單繼承。

問題:按理說,兩個線程訪問同一個共享變量ticket,一般要加鎖纔可以達到同步效果。這裏爲什麼可以不用加鎖呢?如果在run方法上,加鎖肯定也是對的。

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