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方法上,加锁肯定也是对的。