使用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方法上,加鎖肯定也是對的。