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. Android学习第三天-签名常用命令

    由于怕篇幅过长,所以把这个打包常用命令分开成两篇博文来进行讲解,下面我们直接进入主题吧. 8.keytool 这是我们JDK自带的密钥和证书管理工具 命令: -certreq 生成证书请求 -chan ...

  2. 兼容各浏览器的js判断上传文件大小

    由于项目需要,在网上找了一个JS判断上传文件大小的程序,经测试兼容IE6-,Firefox10,Opera11.,safari5.,chrome17 <!DOCTYPE html> < ...

  3. Uiautomator 2.0之UiDevice新增API学习小记

    1. InstrumentationRegistry类 1.1. 类说明: 一个暴露的注册实例,持有instrumentation运行的进程和参数,还提供了一种简便的方法调用instrumentati ...

  4. Constraint6:更新外键约束(Foreign Key Constraint)的引用列

    在SQL Server中,表之间存在引用关系,引用关系通过创建外键约束(Foreign Key Constraint)实现.如果一个Table中的column被其他Table引用,那么该表是参考表,或 ...

  5. OLE DB Command transformation 用法

    OLE DB Command transformation component 能够引用参数,逐行调用sqlcommand,This transformation is typically used ...

  6. LINQ系列:LINQ to SQL Concat/Union

    1. Concat 单列Concat var expr = (from p in context.Products select p.ProductName) .Concat( from c in c ...

  7. VB.NET 创建文件以及文件的读写(创建随机数)

    创建文件 Dim strFile As String = String.Format("C:\ErrorLog.txt", DateTime.Today.ToString(&quo ...

  8. geotrellis使用(九)使用geotrellis进行栅格渲染

    目录 前言 图像渲染 总结 参考链接 一.前言        前面几篇文章讲解了如何使用Geotrellis进行数据处理.瓦片生成等,今天主要表一下如何使用Geotrellis进行栅格渲染.     ...

  9. 利用免费的Spire.XLS控件制作Excel报表

    我们小组上个季度接手了一个项目其中需要实现创建excel文档的功能,寻找实现这个功能的控件的任务分配给了我,通过百度搜索我找到了一个免费的控件,它是由E-iceblue公司推出的spire.xls控件 ...

  10. 实现tap的多种方式

    一.tap.js 这是一个比较轻量的插件tap.js,142行代码,支持模块化开发. 1)handleEvent addEventListener方法中的第二个参数,我原先并没有注意到其实可以传一个对 ...