1、Runnable是一个接口,当实现该接口时需要复用run方法,在run方法中实现自己的逻辑。

2、Thread是一个类,它其实实现了Runnable方法,也就是说当你通过new 一个Thread得到一个线程实例时,其实就是重写runnable里面的run方法。当你通过实现runnable创建一个线程实例时,你需要将runnable实例传递一个thread,然后通过.start开启线程。

3、Runnable可以线程同步,但是Thread不可以线程同步,例如一共有10张票,你可以开启3个线程同时卖票,如果你通过继承thread创建一个卖票的类,实例化3个线程会各自卖10张票,一共就卖出了30张,当时你通过实现runnable所创建的卖票类,只需要实例化一个对象,将一个对象传递给三个thread,然后开启三个线程,你会发现三个线程一共只会卖10张。

4、以下是卖票的代码

package com.shine.test;
/**
 * 通过继承thread的卖票类
 * @author ASUS
 *
 */
public class MyThread extends Thread {

    ;
    boolean flag = true;
    public MyThread(String string) {
        this.setName(string);
    }

    @Override
    public void run() {
        while(flag){
            saleTick();
        }
    }

    public void saleTick() {
        ){
            ticks--;

            System.out.println(Thread.currentThread().getName()+":"+ticks);
        }else{
            flag = false;
        }
    }

}
package com.shine.test;
/**
 * 通过实现Runnable的卖票类
 * @author ASUS
 *
 */
public class MyRunnable implements Runnable {

    ;
    boolean flag = true;
    @Override
    public void run() {
        while(flag){
            saleTick();
        }

    }
    public void saleTick() {
        ){
            ticks--;
            System.out.println(Thread.currentThread().getName()+":"+ticks);
        }else{
            flag = false;
        }
    }
}
package com.shine.test;

public class Test {

    /**测试
     * @param args
     */
    public static void main(String[] args) {
        MyThread myThread1 = new MyThread("thread1");
        MyThread myThread2 = new MyThread("thread2");
        MyThread myThread3 = new MyThread("thread3");
        myThread1.start();
        myThread2.start();
        myThread3.start();

        MyRunnable myRunnable = new MyRunnable();
        Thread runnable1 = new Thread(myRunnable);
        Thread runnable2 = new Thread(myRunnable);
        Thread runnable3 = new Thread(myRunnable);
        runnable1.setName("runnable1");
        runnable2.setName("runnable2");
        runnable3.setName("runnable3");
        runnable1.start();
        runnable2.start();
        runnable3.start();

    }

}
结果:thread1:
thread1:
thread1:
thread1:
thread1:
thread1:
thread1:
thread1:
thread1:
thread1:
thread2:
thread2:
thread2:
thread2:
thread2:
thread2:
thread2:
thread2:
thread2:
thread2:
thread3:
runnable1:
runnable1:
runnable1:
runnable1:
runnable1:
runnable1:
runnable1:
runnable1:
runnable1:
runnable1:
thread3:
thread3:
thread3:
thread3:
thread3:
thread3:
thread3:
thread3:
thread3:

由于系统自身的线程选择问题 全部由runnable1完成了卖票 但总共只卖出了10张 thread的则卖出了30张

Runnable和Thread的更多相关文章

  1. Android笔记——Handler Runnable与Thread的区别

    在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的run() ...

  2. Java中Runnable和Thread的区别

    在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的run() ...

  3. Runnable,Thread实现多线程以及Runnable的同步资源共享

    (一) 实现多线程有两种方式 (1) 继承Thread类,重写run()方法,如以下例子 class MyThread extends Thread{ public void run(){ // } ...

  4. Android开发:Handler Runnable和Thread之间的区别和联系 应用--------------------看完本篇,从此一览无余!

    http://blog.csdn.net/yanzi1225627/article/details/8582081 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnab ...

  5. java多线程(二)-Runnable和Thread

    Java在顺序性语言的基础上提供了多线程的支持.Java的线程机制是抢占式的.这表示调度机制会周期的中断线程,将上下文切换到另一个线程,从而为每个线程都提供时间片.(与抢占式多线程对应的是 协作式多线 ...

  6. Java多线程中的Runnable和Thread

    摘要: 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的r ...

  7. Android开发笔记之:Handler Runnable与Thread的区别详解

    在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一 个类只要继承了Thread类同时覆写了本类中的run( ...

  8. Java多线程之Runnable与Thread

    Java多线程之Thread与Runnable 一.Thread VS Runnable 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类和 ...

  9. 彻底理解Runnable和Thread的区别

    昨天去面试,面试官问了一个问题:Runnable和Thread有什么区别,因为针对这个问题以前有背过,并且网上大多数都是这些结论,所以脱口而出: 1.Thread有单继承的问题: 2.Runnable ...

  10. Runnable和Thread比较

    看代码 public static void main(String[] args) { // TODO Auto-generated method stub new MyThread().start ...

随机推荐

  1. HTTPS那些事(一)HTTPS原理(转载)

    原创地址:http://www.guokr.com/post/114121/   楔子 谣言粉碎机前些日子发布的<用公共WiFi上网会危害银行账户安全吗?>,文中介绍了在使用HTTPS进行 ...

  2. 使用Emit把Datatable转换为对象集合(List<T>)

    Emit生成动态方法部分摘自网上,但是经过修改,加入了对委托的缓存以及类结构的调整,使之调用更简洁方便.大致的思路是:要实现转换datatable到某个指定对象的集合,本质是实现转换一个datarow ...

  3. angularjs自动化测试系列之jasmine

    angularjs自动化测试系列之jasmine jasmine参考 html <!DOCTYPE html> <html lang="en"> <h ...

  4. Python标准库的threading.Thread类(转自别人的翻译)

    这个类表示在单独的控制线程中运行的活动.有两种方法可以指定这种活动,给构造函数传递回调对象,或者在子类中重写run() 方法.其他方法(除了构造函数)都不应在子类中被重写.换句话说,在子类中只有__i ...

  5. 轻量级前端MVVM框架avalon - 控制器

    引子: 最近工作挺忙,avalon只能断断续续的写下去了,大概看了下angular的源码,看到小一半就比较难坚持了,是块硬骨头,慢慢啃吧 不过angular的的文档中用词还是很优雅: HTML编译器 ...

  6. ASP.NET MVC5 网站开发实践(二) Member区域 - 咨询管理的架构

    咨询.留言.投诉等功能是网站应具备的基本功能,可以加强管理员与用户的交流,在上次完成文章部分后,这次开始做Member区域的咨询功能(留言.投诉都是咨询).咨询跟文章非常相似,而且内容更少.更简单. ...

  7. Android音频开发之MediaRecorder/MediaPlayer

    前言: 上次我们介绍了实时采集音频数据以及播放,今天我们来认识一下直接录制文件的方式. 直接上代码:录制管理类 public class MediaRecorderManager { public s ...

  8. android给View设置上下左右边框

    给View控件设置边框,可以动态设置上下左右.通过布局文件就能搞定 1.在drawable文件夹下新建一个shape_main_list_bg.xml文件 <layer-list xmlns:a ...

  9. 关于SubSonic3.0查询或更新时出现System.NullReferenceException异常的处理

    在调试程序时,同事发现添加记录时,出现了System.NullReferenceException异常 DictBase dict = new DictBase();    dict.DictCode ...

  10. Java ConcurrentHashMap Example and Iterator--转

    原文地址:http://www.journaldev.com/122/java-concurrenthashmap-example-iterator#comment-27448 Today we wi ...