Thread是如何处理Runnable的

 

灵感来源于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()方法执行完毕后的操作或者监听



 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值