灵感来源于Java中继承thread类与实现Runnable接口的区别
看完之后突然想知道不同的Thread对象是如何共享runnable对象里的数据的。
参数为Runnable对象的构造函数(当然,构造函数还有很多,咱就不一一说了)
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}
init()函数里将runnable对象赋给target变量
private void init(ThreadGroup g, Runnable target, String name, long stackSize) {
....................
this.target = target;
....................
}
....................
this.target = target;
....................
}
target变量只是一个普通的Runnable对象
private Runnable target;
调用start()方法后最终回到run()方法,在这里调用runnable对象的run方法
public void run() {
if (target != null) {
target.run();
}
}
所以得到的结论是:不同的thread对象都持有对同一个runnable对象的引用,所以相当于共享变量
那假如构造Thread的时候传入Runnable对象,又重写run()方法会怎么样呢?
假如是完全重写的话,那么你的runnable对象就相当于白传了,里面的run()方法不会被调用。
但假如是super.run()呢?
不多说,上代码和结果
Thread t1 = new Thread(mt, "一号窗口"){
private int num=0;
@Override
public void run() {
super.run();
num++;
System.out.println("一号窗口卖完了");
}
};
Thread t2 = new Thread(mt, "二号窗口"){
private int num=0;
@Override
public void run() {
super.run();
num++;
System.out.println("二号窗口卖完了");
}
};
Thread t3 = new Thread(mt, "三号窗口"){
private int num=0;
@Override
public void run() {
super.run();
num++;
System.out.println("三号窗口卖完了");
}
};
结果则是:
一号窗口卖票---->9
三号窗口卖票---->8
二号窗口卖票---->10
三号窗口卖票---->6
一号窗口卖票---->7
三号窗口卖票---->4
二号窗口卖票---->5
三号窗口卖票---->2
一号窗口卖票---->3
三号窗口卖完了
二号窗口卖票---->1
一号窗口卖完了
二号窗口卖完了
看到这里,我想你应该明白了什么
这里可以用于书写thread对象里runbable对象的run()方法执行完毕后的操作或者监听