关闭

Thread是如何处理Runnable的

标签: java线程安卓源码
154人阅读 评论(0) 收藏 举报
分类:

灵感来源于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;
        ....................
    }

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
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1752次
    • 积分:66
    • 等级:
    • 排名:千里之外
    • 原创:5篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类