纯属猜测,有什么不对的地方欢迎指正!
Java并发线程中的Thread类是“自己”的吗?
import java.text.SimpleDateFormat;
public class Main extends Thread {
private int sleepTime;
public Main(String name, int sleepTime) {
super(name);
this.sleepTime = sleepTime;
}
private static int piao = 15;
@Override
public void run() {
for(;piao>0;) {
System.out.println(getName() + "抢到了第" + piao-- + "张票。" + new SimpleDateFormat("HH:mm:ss.SSS").format(System.currentTimeMillis()));
try {
sleep(sleepTime);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) throws InterruptedException {
// 首先,我们让Main类继承Thread类,这样他们肯定会拥有“自己”的sleep方法
System.out.println("继承线程类,调用自己的sleep方法");
Main t1 = new Main("小明a", 500);
Main t2 = new Main("小美b", 1000);
Main t3 = new Main("小刚c", 3000);
t1.start();
t2.start();
t3.start();
// 阻塞他们三个,直到都运行完再测试下一个。
t1.join();
t2.join();
t3.join();
// 然后,我们定义一个Other类,去实现Runable接口,这样,Other类中就没有sleep方法,只能调用Thread的静态sleep方法。
// 所以,按照我的猜测,他们应该是在sleep的时候,大家所有人都被阻塞了?或者只有主线程被阻塞了?那样应该不会影响到他们啊?
System.out.println("实现Runable接口,调用Thread的sleep方法");
Thread.sleep(100);
Other.main();
// 事实是,执行结果和上面基本一致。
// 所以,我有理由猜测,Thread是类似于ThreadLocal那样的,每个线程有“自己”的一个Thread类!
// 或者说,在不同的线程中,调用到的Thread类不是同一个!
}
}
class Other implements Runnable {
private int sleepTime;
public Other(int sleepTime) {
this.sleepTime = sleepTime;
}
private static int piao = 15;
@Override
public void run() {
for(;piao>0;) {
System.out.println(Thread.currentThread().getName() + "抢到了第" + piao-- + "张票。" + new SimpleDateFormat("HH:mm:ss.SSS").format(System.currentTimeMillis()));
try {
Thread.sleep(sleepTime);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main() {
new Thread(new Other(500), "小明d").start();
new Thread(new Other(1000), "小美e").start();
new Thread(new Other(3000), "小刚f").start();
}
}
运行结果
继承线程类,调用自己的sleep方法
小刚c抢到了第13张票。22:49:48.567
小明a抢到了第15张票。22:49:48.567
小美b抢到了第14张票。22:49:48.568
小明a抢到了第12张票。22:49:49.070
小美b抢到了第11张票。22:49:49.569
小明a抢到了第10张票。22:49:49.571
小明a抢到了第9张票。22:49:50.071
小美b抢到了第8张票。22:49:50.570
小明a抢到了第7张票。22:49:50.572
小明a抢到了第6张票。22:49:51.073
小刚c抢到了第5张票。22:49:51.569
小美b抢到了第4张票。22:49:51.571
小明a抢到了第3张票。22:49:51.573
小明a抢到了第2张票。22:49:52.073
小美b抢到了第1张票。22:49:52.571
实现Runable接口,调用Thread的sleep方法
小美e抢到了第15张票。22:49:54.570
小明d抢到了第14张票。22:49:54.570
小刚f抢到了第13张票。22:49:54.570
小明d抢到了第12张票。22:49:55.070
小美e抢到了第11张票。22:49:55.571
小明d抢到了第11张票。22:49:55.571
小明d抢到了第10张票。22:49:56.073
小美e抢到了第9张票。22:49:56.572
小明d抢到了第8张票。22:49:56.573
小明d抢到了第7张票。22:49:57.074
小刚f抢到了第6张票。22:49:57.571
小美e抢到了第5张票。22:49:57.573
小明d抢到了第4张票。22:49:57.575
小明d抢到了第3张票。22:49:58.075
小美e抢到了第2张票。22:49:58.573
小明d抢到了第1张票。22:49:58.576