http://developer.51cto.com/art/201203/321042.htm

Thread(Runnable target)

Allocates a new Thread object.

在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限,

  下面看例子:

  package org.thread.demo;

  class MyThread extends Thread{

  private String name;

  public MyThread(String name) {

  super();

  this.name = name;

  }

  public void run(){

  for(int i=0;i<10;i++){

  System.out.println("线程开始:"+this.name+",i="+i);

  }

  }

  }

  package org.thread.demo;

  public class ThreadDemo01 {

  public static void main(String[] args) {

  MyThread mt1=new MyThread("线程a");

  MyThread mt2=new MyThread("线程b");

  mt1.run();

  mt2.run();

  }

  }

  但是,此时结果很有规律,先第一个对象执行,然后第二个对象执行,并没有相互运行。在JDK的文档中可以发现,一旦调用start()方法,则会通过JVM找到run()方法。下面启动

  start()方法启动线程:

  package org.thread.demo;

  public class ThreadDemo01 {

  public static void main(String[] args) {

  MyThread mt1=new MyThread("线程a");

  MyThread mt2=new MyThread("线程b");

  mt1.start();

  mt2.start();

  }

  };这样程序可以正常完成交互式运行。那么为啥非要使用start();方法启动多线程呢?

  在JDK的安装路径下,src.zip是全部的java源程序,通过此代码找到Thread中的start()方法的定义,可以发现此方法中使用了private native void start0();其中native关键字表示可以调用操作系统的底层函数,那么这样的技术成为JNI技术(java Native Interface)

  ·Runnable接口

  在实际开发中一个多线程的操作很少使用Thread类,而是通过Runnable接口完成。

  public interface Runnable{

  public void run();

  }

  例子:

  package org.runnable.demo;

  class MyThread implements Runnable{

  private String name;

  public MyThread(String name) {

  this.name = name;

  }

  public void run(){

  for(int i=0;i<100;i++){

  System.out.println("线程开始:"+this.name+",i="+i);

  }

  }

  };

  但是在使用Runnable定义的子类中没有start()方法,只有Thread类中才有。此时观察Thread类,有一个构造方法:public Thread(Runnable targer)此构造方法接受Runnable的子类实例,也就是说可以通过Thread类来启动Runnable实现的多线程。(start()可以协调系统的资源):

  package org.runnable.demo;

  import org.runnable.demo.MyThread;

  public class ThreadDemo01 {

  public static void main(String[] args) {

  MyThread mt1=new MyThread("线程a");

  MyThread mt2=new MyThread("线程b");

  new Thread(mt1).start();

  new Thread(mt2).start();

  }

  }

  · 两种实现方式的区别和联系:

  在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比

  继承Thread类有如下好处:

  ->避免点继承的局限,一个类可以继承多个接口。

  ->适合于资源的共享

  以卖票程序为例,通过Thread类完成:

  package org.demo.dff;

  class MyThread extends Thread{

  private int ticket=10;

  public void run(){

  for(int i=0;i<20;i++){

  if(this.ticket>0){

  System.out.println("卖票:ticket"+this.ticket--);

  }

  }

  }

  };

  下面通过三个线程对象,同时卖票:

  package org.demo.dff;

  public class ThreadTicket {

  public static void main(String[] args) {

  MyThread mt1=new MyThread();

  MyThread mt2=new MyThread();

  MyThread mt3=new MyThread();

  mt1.start();//每个线程都各卖了10张,共卖了30张票

  mt2.start();//但实际只有10张票,每个线程都卖自己的票

  mt3.start();//没有达到资源共享

  }

  }

  如果用Runnable就可以实现资源共享,下面看例子:

  package org.demo.runnable;

  class MyThread implements Runnable{

  private int ticket=10;

  public void run(){

  for(int i=0;i<20;i++){

  if(this.ticket>0){

  System.out.println("卖票:ticket"+this.ticket--);

  }

  }

  }

  }

  package org.demo.runnable;

  public class RunnableTicket {

  public static void main(String[] args) {

  MyThread mt=new MyThread();

  new Thread(mt).start();//同一个mt,但是在Thread中就不可以,如果用同一

  new Thread(mt).start();//个实例化对象mt,就会出现异常

  new Thread(mt).start();

  }

  };

  虽然现在程序中有三个线程,但是一共卖了10张票,也就是说使用Runnable实现多线程可以达到资源共享目的。

  Runnable接口和Thread之间的联系:

  public class Thread extends Object implements Runnable

  发现Thread类也是Runnable接口的子类。

Thread class vs Runnnable interface(转)的更多相关文章

  1. Android线程管理(三)——Thread类的内部原理、休眠及唤醒

    线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用. ...

  2. Android Non-UI to UI Thread Communications(Part 1 of 5)

    original:http://www.intertech.com/Blog/android-non-ui-to-ui-thread-communications-part-1-of-5/ ANDRO ...

  3. Delphi thread exception mechanism

    http://www.techques.com/question/1-3627743/Delphi-thread-exception-mechanism i have a dilema on how ...

  4. java 线程 (一) Thread

    package cn.sasa.demo1; public class Test { public static void main(String[] args) throws Interrupted ...

  5. Android线程管理(三)——Thread类的内部原理、休眠及唤醒

    线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用. ...

  6. Concurrent.Thread.js

    (function(){ if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'functi ...

  7. jboss hello world

    http://developers.redhat.com/products/devstudio/get-started/ 1. 下载 Red Hat JBoss Developer studio 2. ...

  8. 【翻译二十三】java-并发程序之随机数和参考资料与问题(本系列完)

    Concurrent Random Numbers In JDK 7, java.util.concurrent includes a convenience class, ThreadLocalRa ...

  9. tomcat架构

    很多开源应用服务器都是集成tomcat作为web container的,而且对于tomcat的servlet container这部分代码很少改动.这样,这些应用服务器的性能基本上就取决于Tomcat ...

随机推荐

  1. C语言中结构体的深拷贝和浅拷贝

    C++ 的浅拷贝和深拷贝(结构体) 拷贝有两种:深拷贝,浅拷贝 浅拷贝:拷贝过程中是按字节复制的,对于指针型成员变量只复制指针本身,而不复制指针所指向的目标 (1)结构体中不存在指针成员变量时 typ ...

  2. 尝试一下LLJ大佬的理论AC大法

    1.BZOJ 3522 Poi2014 Hotel DFS 给定一棵树,求有多少无序三元组(x,y,z)满足x,y,z互不相等且Dis(x,y)=Dis(y,z)=Dis(x,z) 枚举中心点,分别d ...

  3. 【arc072f】AtCoder Regular Contest 072 F - Dam

    题意 有一个体积为L的水池,有N天 每天早上进水Vi体积的Ti温度的水. 每天晚上可以放掉任意体积的水. 问每天中午,水池满的情况下,水温最高多少. 水的温度只受新加进的谁的影响,对于水\(W1(T1 ...

  4. day2(老男孩-Python3.5-S14期全栈开发)

    作者:赵俊            发布日期:2019/11/5 一.模块初识 import sys '''默认在当前目录下找模块,找不到再去python环境变量中寻找''' print(sys.pat ...

  5. Vuejs实战项目五:数据列表

    1.在EasyMock 中添加数据列表模拟接口 请求url:/suyuan/list 请求方式:get 描述:数据列表 mock.js配置: 例: { "code": 2000, ...

  6. AGC035D

    AGC035D Add and Remove 题意 给出\(n\)个数,每次删除一个不在两端的数,然后把它的权值加到相邻的两个数上. 问操作\(n-2\)次后,所剩的两数之和的最小值 \(n\le18 ...

  7. Leetcode453.Minimum Moves to Equal Array Elements最小移动次数使数组元素相等

    给定一个长度为 n 的非空整数数组,找到让数组所有元素相等的最小移动次数.每次移动可以使 n - 1 个元素增加 1. 示例: 输入: [1,2,3] 输出: 3 解释: 只需要3次移动(注意每次移动 ...

  8. 微信小程序示例

    http://www.cnblogs.com/ihardcoder/p/6097941.html http://www.wxapp-union.com/ http://blog.csdn.net/li ...

  9. webpack4配置react开发环境

    webpack4大大提高了开发效率,简化了配置复杂度,作为一个大的版本更新,作为一个对开发效率执着的爱折腾的程序员,已经忍不住要尝尝鲜了 首先是cli和webpack的分离,开发webpack应用程序 ...

  10. linux定时跑php脚本,防止重复跑,死循环

    $PHP_SELF = realpath($_SERVER['PHP_SELF']); if (!($argc > 1)) { $lock_file = $PHP_SELF . '.lock'; ...