当我们继承Thread的时候可以看出。

调用run()与start()来启动多线程是有区别。

如下我们开启多线程时

MyThread  mt1 = new MyThread(“线程A”);

MyThread  mt1 = new MyThread(“线程A”);

mt1.run():

mt2.run():

发现以上的程序是先执行完mt1后执行mt2,并没有交错运行。也就是说此次线程并没有启动,还是属于顺序式的执行方式。那么我们以star()来启动线程回事如何?

MyThread  mt1 = new MyThread(“线程A”);

MyThread  mt1 = new MyThread(“线程A”);

mt1.start():

mt2.start():

结果中可以发现两个线程是交错运行的。哪个线程先抢到了CPU资源,哪个线程就可以运行。所以程序每次运行输出的顺序式不一样的。单虽然调用的是start()但是最终还是调用的是run()方法。

以下是Start()部分源代码:

当我们调用多次start()时会产生错误。这也是避免了重复调用start()。

还有Thread本身实现了Runable从源代码中可以看出:

如果一个类只能继承Thread类才能实现多线程,则必定受到单线程的局限性。

所以一般来说我们会用Runable接口来完成多线程操作。

那么问题是实现Runable接口的类是没有start()方法的。

Thread提供以构造函数来传递Runable对象。

Public Thread(Runable target);

Public Thread(Runable target,String name);

那么我们可以通过Thread启动实现Runable接口的类了。

new Thread(MyRunable).start();

Thread与Runable的重要区别之一是:

Thread不适合于多线程共享资源。

Runable可以方便地实现资源的共享。

class MyThread extends Thread{
private int ticket = 5;
  public void run(){
    for(int i=0;i<5;i++){
    if(ticket>0)
    System.out.println(“卖票:ticket = “ + ticket--);
      }
    }
  }
public class ThreadDemo{
  public static void main(String args[]){
    MyThread mt1 = new MyThread();
    MyThread mt1 = new MyThread();
    MyThread mt1 = new MyThread();
    mt1.start();
    mt2.start();
    mt3.start();
  }
}

运行结果为依次重复54321三次:

class MyThread implements Runable{

private int ticket = 5;

  public void run(){
    for(int i=0;i<5;i++){
    if(ticket>0)
    System.out.println(“卖票:ticket = “ + ticket--);
      }
    }
  } public class ThreadDemo{
  public static void main(String args[]){
    MyThread runable = new MyThread();
    new MyThread(runable).start();
    new MyThread(runable).start();
    new MyThread(runable).start();   
  }
}

运行结果你会发现只会输出一次54321:

简单介绍一下线程状态:

Thread与Runable的更多相关文章

  1. 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...

  2. 多线程爬坑之路-Thread和Runable源码解析

    多线程:(百度百科借一波定义) 多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提 ...

  3. android Thread和Runable区别,精讲(有疑问)

    网上总是说Runable和Thread可以实现线程,这导致我对Thread和Runable有错误的理解,谁让当时不求甚解,让我一直以为实现Runable可以开启线程. 看过源码后进行区分这两者. 无论 ...

  4. Thread和Runable的区别、Synchronized锁关键字

    一.Thread和Runable的区别 Thread是基类,子类必继承他实现其run方法.其也是实现了Runable接口.Thread是普通的类,并非抽象类或者密封类等. Runnable是接口,子类 ...

  5. [Java多线程]-Thread和Runable源码解析之基本方法的运用实例

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...

  6. [Java多线程]-Thread和Runable源码解析

    多线程:(百度百科借一波定义) 多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提 ...

  7. java Thread和Runable的深刻理解

    线程(Thread)是指程序的运行流程,多线程机制指同时运行多个程序块. Java中实现多线程有两种方法:继承Thread类:实现Runnable接口. Thread类的run()方法的制定者:接口R ...

  8. java lang(Thread) 和 Runable接口

    public interface Runnable { public abstract void run(); } public class Thread implements Runnable { ...

  9. Thread和Runable实现多线程

    分析两种实现多线程的方式:Thread类和Runnable接口 写一个程序,模拟4个售票窗口共同卖100张火车票的程序. 1:使用继承Thread类方式实现(). 2:使用实现Runnable接口方式 ...

随机推荐

  1. flex的Cairngorm框架

    由于要写flex的项目,接触了一段时间的Cairngorm框架,初步认识它是flex的一个mvc结构的框架实现了页面,调用相应方法的控制,和后台交互之间的三层之间的联系.Cairngorm框架主要包括 ...

  2. C++ 什么是句柄?为什么会有句柄?HANDLE

    出处:http://www.cppblog.com/mymsdn/archive/2009/02/19/handle-in-windows.html 从广义上,能够从一个数值拎起一大堆数据的东西都可以 ...

  3. visio2007无法拖动

    连按两下键盘上的 “Esc” 键

  4. 在代码中调用 mvc 4 api

    mvc 4 api 的调用有很多种,最常见也最简单的一种是 用 ajax 的方式在前端界面中调用, 如果是在后台代码中调用 ,是要复杂一些,以下是 以 post 的方式调用 api 的封装好的方法: ...

  5. Jquery 对象与 DOM对象的相互转换

    在做 web 开发时,经常会用到 jquery 和 dom 对象, 有时候需要在这两个对象间进行切换. Jquery 对象 就是通过jQuery包装DOM对象后产生的对象.jQuery对象是jQuer ...

  6. bash中正则表达式

    工作中需要用bash的地方不是很多,之前只是大致了解过,每每用到都得去网上查询,遂决定以后将所用到的正则用法在这里统一收藏,便于学习. 1.echo 'inet addr:10.1.1.1  Bcas ...

  7. 洛谷P1461 海明码 Hamming Codes

    P1461 海明码 Hamming Codes 98通过 120提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交  讨论  题解 最新讨论 暂时没有讨论 题目描述 给出 N,B 和 ...

  8. openStack reboot调试

  9. ASP.NET的SEO:目录

    ASP.NET的SEO:基础知识 ASP.NET的SEO:Global.asax和HttpModule中的RewritePath()方法--友好的URL ASP.NET的SEO:正则表达式 ASP.N ...

  10. ASP.NET(C#)--Repeater中生成“序号”列

    需求介绍:在Repeater(Table)中加入“序号”列,从1开始自增,步长为1. 思路:因为“序号”跟Repeater的行号有关,所以要在Repeater的ItemDataBound事件中输出“序 ...