当我们继承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. [UI]Flat UI - Free Boorstrap Framework and Theme

    ---------------------------------------------------------------------------------------------------- ...

  2. worker启动executor源码分析-executor.clj

    在"supervisor启动worker源码分析-worker.clj"一文中,我们详细讲解了worker是如何初始化的.主要通过调用mk-worker函数实现的.在启动worke ...

  3. yii中的若干问题

    一直觉得”程序猿“是个很细致的工作,就像绣花一样,一不小心缝错一针,就可能是个很大的bug,但是为什么平时看起来大而化之的男同胞们确能在这方面如此care呢?? 以下进入正文,省去华丽丽的词语,这里仅 ...

  4. 学习练习 java 二分查找法

    package com.hanqi; import java.util.*; public class Test5 { public static void main(String[] args) { ...

  5. C# 图片旋转360度程序

    这几天开发一个程序,需要将一个图片旋转360度然后每一个角度保存下来.刚开始本来想着是让美工弄的,但是让一个美工手动转360度,她会喷你一脸. using System; using System.C ...

  6. 【MySQL】查询使用临时表

    MySQL查询产生临时表的分析 官网说明的地址:http://dev.mysql.com/doc/refman/5.5/en/internal-temporary-tables.html 参考:htt ...

  7. ASP.NET的SEO:HTTP报头状态码---内容重定向

    本系列目录 我们经常说"404错误",你知道他指的是什么意思么? 404其实是Http报头所包含的一个"状态码",表明该Http请求失败.那么除此之外,还有哪些 ...

  8. grub2

    手工启动 set  root(hd0,msdos7) linux  /boot/vmlinuz-3.9.8-300.fc19.i686.PAE  root=/dev/sda7 initrd  /boo ...

  9. C 小复习

    C语言 signed 与 unsigned: C语言中,当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型 signed ; unsigned ; cout << a ...

  10. JavaScript常用标签和方法总结

    什么是javascript?   (1) JavaScript是一种基于对象(Object)和事件驱动(Event Driven)并具有安全性能的 脚本语言. (2) JavaScript是由Nets ...