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. 你可能不知道的7个CSS单位

    如果你是一名前端开发工程师,一般px和em使用频率比较高.但是今天本文的重点是介绍一些我们使用很少.甚至么有听说的单位. 一.重温em <style type="text/css&qu ...

  2. ASP.NET MVC 从零开始 - 自动化部署(其二)

    这篇文章是从我的 github 博客 http://lxconan.github.io 导入的. 这是这个系列的第五篇了,前四篇请参见: ASP.NET MVC 从零开始 – Create and R ...

  3. xamarin UWP ActivityIndicator

    在xamarin的UWP平台使用ActivityIndicator时,如果你时后台创建的这个对象,请设置他的宽度,不然在UWP平台下会发现找不这个对象,其实是在这个平台和特点版本下的宽度没设置,导致有 ...

  4. Objective-C 原型模式 -- 简单介绍和使用

    用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. Prototype原型模式是一种创建型设计模式,Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建 ...

  5. Android开发学习之路-提升用户体验小技巧

    记得之前看谷歌的一个视频提到这个用户体验的问题,今天想起来了就写了个Demo来记录下. 当一个事件发生之后,用户需要一段时间才能知道结果,那么这段时间究竟应该让用户干什么?这个问题很常见,比如我们的软 ...

  6. AngularJS 源码分析2

    上一篇地址 本文主要分析RootScopeProvider和ParseProvider RootScopeProvider简介 今天这个rootscope可是angularjs里面比较活跃的一个pro ...

  7. JS原生第八篇 (帅哥)

    1.1 复习     1. clientX          clientWidth   可视区域的宽度 clientWidth     width  +  padding offsetWidth   ...

  8. 12款非常精致的免费 HTML5 & CSS3 网站模板

    01. Joefrey Mahusay 很炫的单页网站模板,基于 HTML5 & CSS3 制作,适合用于设计师个人简历.摄影师和平面设计师的个人作品展示. 演示  下载 02. Folder ...

  9. MVVM框架下 WPF隐藏DataGrid一列

    最近的一个项目,需要在部分用户登录的时候,隐藏DataGrid中的一列,但是常规的绑定不好使,在下面举个例子. XAML部分代码 <Window x:Class="DataGridCo ...

  10. IOS数据存储之FMDB数据库

    前言: 最近几天一直在折腾数据库存储,之前文章(http://www.cnblogs.com/whoislcj/p/5485959.html)介绍了Sqlite 数据库,SQLite是一种小型的轻量级 ...