关闭

Thread是如何处理Runnable的

标签: java线程安卓源码
444人阅读 评论(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
查看评论

JAVA多线程之Runnable和Thread比较

在我们开发的过程中常常会碰到多线程的问题,对于多线程的实现方式主要有两种:实现Runnable接口、继承Thread类。对于这两种多线程的实现方式也是有着一些差异。既然实现了多线程那必然离不开管理这些线程,当问题比简单时一个或者几个线程就OK了,也涉及不到效率问题。一旦线程数量多起来的时候,必然躲不...
  • u013755987
  • u013755987
  • 2016-07-11 21:15
  • 10593

Thread 和 Runnable 的区别

Thread 和 Runnable 的区别 实际上,Thread也是一个Runnable,它实现了Runnable接口,在Thread类中有一个Runnable类型的target字段,代表要被执行在这个子线程中的任务。 public class Thread implemen...
  • import_sadaharu
  • import_sadaharu
  • 2016-08-03 23:42
  • 3255

Java中 Thread和Runnable实现多线程的区别和联系

Java有两种方式实现多线程,第一个是继承Thread类,第二个是实现Runnable接口。他们之间的联系: 1、Thread类实现了Runable接口。 2、都需要重写里面Run方法。 他们之间的区别“ 1、实现Runnable的类更具有健壮性,避免了单继承的局限。 2、Runnable更容易实现...
  • oxuanboy1
  • oxuanboy1
  • 2016-06-22 12:18
  • 2269

Thread和Runnable的区别

Thread 与Runnab le区别 博客分类: java 多线程ThreadRunnable  大家都知道多线程可以通过两种方式来创建。 一、通过继承Thread类 二、通过实现Runnable接口 那么中两种方式到底有什么区别呢?那种方式更好些呢? 我...
  • xiaohuizi2009
  • xiaohuizi2009
  • 2012-06-06 21:08
  • 11854

Thread和Runnable之间的关系

public class Thread implements Runnable{   private Runnable target; //Thread实现Runnable接口,但是并没有完全实现run() 方法,此方法是Runnable子类完成的,所以如果继承Thread就必须覆写run...
  • YZWDNN
  • YZWDNN
  • 2016-05-30 18:34
  • 527

Java中Runnable和Thread的区别

概述 Runnable 是接口。 Thread 是类,且实现了Runnable接口。 Thread部分源码 public class Thread implements Runnable { private static class Caches { ...
  • zengmingen
  • zengmingen
  • 2016-11-18 15:42
  • 1338

Java中Runnable和Thread区别

本来这篇文章是要开始讲讲Handler消息传递机制的。无奈里面牵涉了我不太熟悉的Runnable跟Thread,在学习android前,啃了一段时间的java,但是并没有花太多时间研究。没办法,先把基础打牢实了。Java多线程java中有两种实现多线程的方式: 1. 一种是通过继承Thread类,...
  • uudou
  • uudou
  • 2016-07-06 20:30
  • 10738

浅谈Thread和Runnable

浅谈Thread和Runnable。 线程状态、守护线程介绍
  • qq455276333
  • qq455276333
  • 2015-11-14 17:13
  • 12764

Java线程的5种状态及切换(透彻讲解)

Java中的线程的生命周期大体可分为5种状态。 ①NEW:这种情况指的是,通过New关键字创建了Thread类(或其子类)的对象 ②RUNNABLE:这种情况指的是Thread类的对象调用了start()方法,这时的线程就等待时间片轮转到自己这,以便获得CPU;第二种情况是线程在处于RUNNAB...
  • yaolingrui
  • yaolingrui
  • 2012-04-29 15:12
  • 42380

java线程系列---Runnable和Thread的区别

在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限,   下面看例子:  ...
  • wwww1988600
  • wwww1988600
  • 2012-03-01 11:15
  • 75242
    个人资料
    • 访问:7560次
    • 积分:380
    • 等级:
    • 排名:千里之外
    • 原创:28篇
    • 转载:2篇
    • 译文:0篇
    • 评论:4条
    最新评论