当我们继承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. django 单独测试模块

    今天单独测试django的一个views文件,出现错误import的模块没有定义,这个模块是在django项目中自己编写的,解决办法: 1../manage.py shell 通过命令行进去加载,再执 ...

  2. LA3902 Network

    给出一棵树,对于每一个叶子节点要使得在它的k距离内至少一个节点被打了标记,(叶节点不能打标记,非叶结点也不必满足这个条件),现在已经有一个节点s被打了标记,问至少还要打几个标记(这表达能力也是捉急.. ...

  3. cordova 开发属于自己的插件---android

    还是需要开发出自己的插件的... 我的cordova  version is 4.0.0 1.需要新建一个文件夹为 myplugin 1.1在myplugin文件夹下 新建 plugin.xml文件 ...

  4. PAT1023. Have Fun with Numbers

    //水题,但是考点不水,可能用的strlen属于string库,但是只能用于字符,不能用数字,因为\0就是0.出现0无法判断,其次二倍时有可能有进位 //第一次在二倍进位上出了问题 #include& ...

  5. 【IHttpHandler】了解 IHttpHandler

    1 .概述 说明:HttpHandler是一个HTTP请求的真正处理中心.在HttpHandler容器中,ASP.NET Framework才调用HttpHandler的ProcessRequest成 ...

  6. 在xargx命令中如何使用重定向

    ls *.txt | xargs -i -n 1 sh -c "cut -f 1-3 {} > ../{}"即可

  7. 在C#中对Datatable排序【DefaultView的Sort方法】

    在C#中对Datatable排序,[DefaultView的Sort方法] 代码如下: DataTable dt = new DataTable(); dt.Columns.Add("ID& ...

  8. mysql多实例安装脚本

    #! /bin/bash # v.mysql-5.6.30-linux-glibc2.5-x86_64.tar.gz # only install master mysql # time:2016-0 ...

  9. POJ C程序设计进阶 编程题#1:分配病房

    编程题#1:分配病房 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 某个科 ...

  10. 线程间通信--wait和notify

    使用wait.notify方法实现线程间的通信(注意这两个方法都是object的类的方法,换句话说java为所有的对象都提供了这两个方法) 1.wait和notify必须配合synchronized关 ...