前言
最近再看多线程,关于多线程的实现方式上,我发现大多是帖子都是有些问题的。具体表现在证明继承Thread类和实现Runnable接口两种实现方式对资源共享的区别上。
先说结论(我认为这个是错误的)
大部分帖子都认为继承Thread类不适合资源共享,所以需要用实现Runnable接口的方式。一般都是用卖票的例子还说明,我随便找了一篇然后贴在这里:
然后贴出的运行结果无非是实现Runnable接口的三个线程共卖10张票,继承Thread类的线程则是每个线程卖10张,共卖30张票。这个代码真的能得出这个结论吗?
**当然不能!当然不能!当然不能!**最基本的控制变量法的条件都不满足,好多东西不一样,这种代码的验证方式一点也不严谨。不严谨的验证方式得出的结论也当然是不科学的。真不知道最原始的帖子是从哪来的,而且好多好多帖子都是这种结论。
接下来我们看看正确的验证方法
备注:本文不涉及线程安全,所以没有加同步锁,我也是特意截取的线程不安全的运行结果
方式一 继承Thread类
/**
继承Thread类
*/
public class MyThread extends Thread{
//定义两个成员变量
private int ticket=100;
private String name;
@Override
public void run() {
while(ticket > 0){
System.out.println(ticket-- + "张票已被售卖,售卖窗口为" + Thread.currentThread().getName());
}
}
public static