当我们继承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. 'UIShell.OSGi.MvcWebExtension.BundleRuntimeControllerFactory' did not return a controller for the name 'Home'.

    在使用osgi.net 框架的时候,有时会遇到这样的错误: 解决办法: 1. 检查项目文件夹下的 log 日志文件,因 osgi.net 在运行时(包括异常和操作)都会在项目的目录下生成 日志文件,并 ...

  2. 生成Excel直接以流或字节形式发给客户端,无需在服务生成一个实体文件。

    public ActionResult ExportAgentBooking(string Company_Id, string Company_Name)//Altman.Web.BCDAdmin. ...

  3. ASP.NET运行机制原理 ---浏览器与IIS的交互过程 自己学习 网上查了下别人写的总结的很好 就转过来了 和自己写的还好里嘻嘻

    一.浏览器和服务器的交互原理 (一).浏览器和服务器交互的简单描述: 1.通俗描述:我们平时通过浏览器来访问网站,其实就相当于你通过浏览器去访问一台电脑上访问文件一样,只不过浏览器的访问请求是由被访问 ...

  4. unity3d发布Android程序

    unity3d是一个跨平台的游戏开发引擎,可以使用c#开发各种平台上的游戏,如windows,Mac,Android,windows phone,IOS,Flash等.下面说下如何将开发好的unity ...

  5. 备份/恢复SQLSERVER数据库,SQL一步实现

      --备份SQL SERVER数据库 BACKUP DATABASE book09 TO DISK ='c:\abc.bak' WITH init --恢复SQL SERVER数据库USE MAST ...

  6. Android IOS WebRTC 音视频开发总结(三二)-- WebRTC项目开发建议

    本文主要介绍WEBRTC开发过程中的一些现象,文章来自博客园RTC.Blacker,支持原创,欢迎关注微信公众号blacker,更多详见www.rtc.help 随着移动互联网和智能硬件的快速发展,音 ...

  7. systemctl

      旧指令 新指令 使某服务自动启动 chkconfig --level 3 httpd on systemctl enable httpd.service 使某服务不自动启动 chkconfig - ...

  8. Face++云相册应用IOS源码

    该源码是一个不错的相册应用,Face++云相册应用源码,以人脸识别作为用户注册和登录的依据,登录后可以进入用户的云相册空间,并对相册进行上传图片或删除图片,另添加了分享功能. <ignore_j ...

  9. mac配置iterm2和ohmyzsh

    点击我直通 iTerm2下载 利用命令下载ohmyzsh curl -L http://install.ohmyz.sh | sh 安装好之后,运行 vi ~/.zshrc 可以查看到以下配置内容信息 ...

  10. mysql 根据生日计算年龄,并查询在18-25之间的语句

    select id, DATE_FORMAT(birthday,"%Y-%m-%d") birthday, CURDATE() , (year(now())-year(birthd ...