java中thread和thread runnablee的区别

选择在海同培训:
一篇文章教你分析Java语言中Runnable和Thread的区别
摘要:在Java语言中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口,下面就拉分别介绍一下这两种方法的优缺点,希望对大家学习Java语言有所帮助。
在Java语言中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口,下面就拉分别介绍一下这两种方法的优缺点,希望对大家学习Java语言有所帮助。Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限,  下面看例子:复制代码代码如下:  package&org.thread.
  class&MyThread&extends&Thread{
  private&String&
  public&MyThread(String&name)&{
  super();
  this.name&=&
  public&void&run(){
  for(int&i=0;i&10;i++){
  System.out.println(&线程开始:&+this.name+&,i=&+i);
  package&org.thread.
  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.
  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.
  class&MyThread&implements&Runnable{
  private&String&
  public&MyThread(String&name)&{
  this.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.
  import&org.runnable.demo.MyT
  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.
  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.
  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.
  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.
  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接口的子类。  本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!
本文由 @Vivian 发布于职坐标。未经许可,禁止转载。
不喜欢&| 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢
快给朋友分享吧~
后参与评论
加入IT交流圈
JAVA工程师交流群
大数据架构师交流群
人工智能Python交流群
WEB/H5前端交流群
编程语言直通车
海同名师推荐
热门就业培训班
JAVA30天热搜词
免费获取海同IT培训资料
验证码手机号,获得海同独家IT培训资料
获取验证码移动开发爱好者,目前还在学习,感觉路很远,写点代码压压惊。
java线程系列---Runnable和Thread的区别、线程同步
鉴于我这篇文章被鄙视了,哈哈哈哈。我决定整理一下资源共享线程同步相关的知识。欢迎鄙视并谈一谈见解。
Java传统多线程的实现有两种方法,继承类或者实现
在这之前需要让大家从源码上了解一下Thread和runnable这两个类,Thread 也是实现自Runnable,在runnable接口里面有个run方法。
@FunctionalInterface
public interface Runnable {
public abstract void run();
}那其实这个run其实就是为了多线程方面的一些扩展抽象出来的一个方法。
那我们就来看看Thread 对这个方法的实现做了什么。
public void run() {
if (target != null) {
target.run();
}内容很简短明了。大概就是执行target的run方法,这个target也有一个run方法。这个target是什么?
全局搜索看一下,在声明中可以看到。
/* What will be run. */
说明这个target是一个runnable对象。而它正是从Thread的构造里面传进来的。
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
到这里大家可能就会明白为什么多个Thread对象传入同一个Runnable对象可以实现资源共享了。
因为runnable对象是同一个啊。
我们都知道线程启动是调用了Thread对象中的start方法;
可以看一下start方法到底做了什么
public synchronized void start() {
* This method is not invoked for the main method thread or "system"
* group threads created/set up by the VM. Any new functionality added
* to this method in the future may have to also be added to the VM.
* A zero status value corresponds to state "NEW".
if (threadStatus != 0)
throw new IllegalThreadStateException();
/* Notify the group that this thread is about to be started
* so that it can be added to the group's list of threads
* and the group's unstarted count can be decremented. */
group.add(this);
boolean started =
} finally {
if (!started) {
group.threadStartFailed(this);
} catch (Throwable ignore) {
/* do nothing. If start0 threw a Throwable then
it will be passed up the call stack */
}这里面 的group是一个线程组对象ThreadGroup。start0()是一个原生方法,大概是调用jvm里面的方法了。started则是一个标志位。
说明它会把这个线程加到线程组中,这个线程组就是用来保存当前线程的一个容器,可以监测线程的生老病死,还有设置组内的优先级等,线程的执行则由start0这个原生的方法控制。
实现接口相比继承类有如下好处
1.避免单继承的局限一个类可以同时实现多个接口
2.适合资源的共享
class MyThread extends Thread {
private int ticket = 5;
public MyThread(String name) {
super(name);
public void run() {
for (int i = 0; i & 5; i++) {
//使用同步方法
public void sale() {
if (this.ticket & 0) {
System.out.println(Thread.currentThread().getName()
+ "卖票:1张 " + this.ticket--);
public static void main(String[] args) {
MyThread mt = new MyThread();
Thread thread1 = new MyThread("售票口一");
Thread thread2 = new MyThread("售票口二");
Thread thread3 = new MyThread("售票口三");
thread1.start();
thread2.start();
thread3.start();
}执行结果如下:
售票口一卖票: 5
售票口一卖票: 4
售票口一卖票: 3
售票口一卖票: 2
售票口一卖票: 1
售票口三卖票: 5
售票口三卖票: 4
售票口三卖票: 3
售票口三卖票: 2
售票口三卖票: 1
售票口二卖票: 5
售票口二卖票: 4
售票口二卖票: 3
售票口二卖票: 2
售票口二卖票: 1
这边可以看出每个线程都有5张票。并没有资源共享。
class MyThread implements Runnable {
private int ticket = 5;
public void run() {
for (int i = 0; i & 5; i++) {
//使用同步方法
public void sale() {
if (this.ticket & 0) {
System.out.println(Thread.currentThread().getName()
+ "卖票: " + this.ticket--);
public static void main(String[] args) {
MyThread mt = new MyThread();
Thread thread1 = new Thread(mt, "售票口一");
Thread thread2 = new Thread(mt, "售票口二");
Thread thread3 = new Thread(mt, "售票口三");
thread1.start();
thread2.start();
thread3.start();
输出结果:
售票口二卖票: 5
售票口二卖票: 3
售票口二卖票: 2
售票口二卖票: 1
售票口三卖票: 4
售票口一卖票: 5
终于资源共享了。哎哟卧槽,怎么两个售票口都卖了一次票5,仔细思考一下。是不是有可能两个线程是同时执行ticket--的。
好像有道理。这个时候就需要同步代码块上场了。我在操作票的时候就不准你们操作了等我操作完,你们再操作。
  1.同步代码块
  2.同步方法
同步代码块
使用关键字进行同步代码块的声明但是在使用此操作时必须明确的指出到底要锁定的是哪个对象一般是以当前对象为主
  synchronized(对象一般都是讲锁定
//锁定对象
class MyThread implements Runnable {
private int ticket = 5;
public void run() {
for (int i = 0; i & 5; i++) {
synchronized (this) {
//使用同步方法
public void sale() {
if (this.ticket & 0) {
Thread.sleep(200);
//休息200毫秒
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println(Thread.currentThread().getName()
+ "卖票: " + this.ticket--);
public static void main(String[] args) {
MyThread mt = new MyThread();
Thread thread1 = new Thread(mt, "售票口一");
Thread thread2 = new Thread(mt, "售票口二");
Thread thread3 = new Thread(mt, "售票口三");
thread1.start();
thread2.start();
thread3.start();
售票口一卖票: 5
售票口一卖票: 4
售票口一卖票: 3
售票口一卖票: 2
售票口二卖票: 1
总算正常了。不过加休眠是什么鬼,这个呃...因为不休眠线程全给一条线程跑完了。囧~~
你们可以试试休眠不加同步。这边会出很多访问的问题。
最后介绍同步方法
class MyThread implements Runnable {
private int ticket = 5;
public void run() {
for (int i = 0; i & 5; i++) {
//使用同步方法
public synchronized void sale() {
if (this.ticket & 0) {
Thread.sleep(100);
//休息200毫秒
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println(Thread.currentThread().getName()
+ "卖票: " + this.ticket--);
public static void main(String[] args) {
MyThread mt = new MyThread();
Thread thread1 = new Thread(mt, "售票口一");
Thread thread2 = new Thread(mt, "售票口二");
Thread thread3 = new Thread(mt, "售票口三");
thread1.start();
thread2.start();
thread3.start();
输出如下:
售票口一卖票: 5
售票口一卖票: 4
售票口一卖票: 3
售票口二卖票: 2
售票口二卖票: 1
最后因为加上了线程锁,很容易出现线程阻塞,死锁等问题。
有问题欢迎探讨!!
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!当前位置: >>
Java中Runnable和Thread的区别
Java 中 Runnable 和 Thread 的区别本文标签:Java 一种是继承 Thread 类, 一种是实现 Runnable 接口; 在 java 中可有两种 模式实现多线程, Thread 类是在 java.lang 包中定义的 。一个类惟独继承了 Thread 类同时覆写了本类中的 run() 步骤就 可以实现多线程操作了,然而一个类不得不继承一个父类,这是此步骤的局限 。 下面看例子: 1 package org.thread. 2 class MyThread extends Thread{ 3 private S 4 public MyThread(String name) { 5 super(); 6 this.name = 7 } 8 public void run(){ 9 for(int i=0;i&10;i++){ 10 System.out.println(&线程开端:&+this.name+&,i=&+i); 11 } 12 } 13 } 14 package org.thread. 15 public class ThreadDemo01 { 16 public static void main(String[] args) { 17 MyThread mt1=new MyThread(&线程 a&); 18 MyThread mt2=new MyThread(&线程 b&); 19 mt1.run(); 20 mt2.run(); 21 } 22 } 然而, 此时后果很有法则, 先第一个对象执行, 而后第二个对象执行, 并没有彼此运行 。 在 JDK 的文档中 可以发现,一旦调用 start() 步骤,则会通过 JVM 找到 run() 步骤 。下面 启动 start() 步骤启动线程: 23 package org.thread. 24 public class ThreadDemo01 { 25 public static void main(String[] args) { 26 MyThread mt1=new MyThread(&线程 a&); 27 MyThread mt2=new MyThread(&线程 b&); 28 mt1.start(); 29 mt2.start(); 30 } 31 }; 这样程序 可以畸形实现交互式运行 。那么为啥非要 使用 start(); 步骤启动多线程呢? 在 JDK 的安装路径下,src.zip 是所有的 java 源程序,通过此代码找到 Thread 中的 start() 步骤的定义,可以发现此步骤中 使用了 private native void start0();其中 native 要害字示意 可达内 java 学习笔记 1 以调用操作系统的底层函数,那么这样的技术成为 JNI 技术(java Native Interface) Runnable 接口 在实际开辟中一个多线程的操作很少 使用 Thread 类,而是通过 Runnable 接口实现 。 32 public interface Runnable{ 33 public void run(); 34 } 例子: 35 package org.runnable. 36 class MyThread implements Runnable{ 37 private S 38 public MyThread(String name) { 39 this.name = 40 } 41 public void run(){ 42 for(int i=0;i&100;i++){ 43 System.out.println(&线程开端:&+this.name+&,i=&+i); 44 } 45 } 46 }; 然而在 使用 Runnable 定义的子类中没有 start() 步骤,惟独 Thread 类中才有 。此时视 察 Thread 类,有一个 构造 步骤:public Thread(Runnable targer)此 构造步骤承受 Runnable 的子类实例,也便是说 可以通过 Thread 类来启动 Runnable 实现的多线程 。(start() 可以协 调系统的资源): 47 package org.runnable. 48 import org.runnable.demo.MyT 49 public class ThreadDemo01 { 50 public static void main(String[] args) { 51 MyThread mt1=new MyThread(&线程 a&); 52 MyThread mt2=new MyThread(&线程 b&); 53 new Thread(mt1).start(); 54 new Thread(mt2).start(); 55 } 56 } 模式的区别和联络: 两种实现 模式的区别和联络: 在程序开辟中惟独是多线程确定永远以实现 Runnable 接口为主,由于实现 Runnable 接 口相比继承 Thread 类有如下 好处: ? 幸免点继承的局限,一个类 可以继承多个接口 。 ? 合适于资源的共享 以卖票程序为例,通过 Thread 类实现: 57 package org.demo. 58 class MyThread extends Thread{ 59 private int ticket=10; 60 public void run(){ 61 for(int i=0;i&20;i++){ 62 if(this.ticket&0){ 63 System.out.println(&卖票:ticket&+this.ticket--); 64 } 65 } 66 }达内 java 学习笔记 2 67 }; 下面通过三个线程对象,同时卖票: 68 69 70 71 72 73 74 75 76 package org.demo. 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();//没有达到资源共享77 } 78 } 假如用 Runnable 就 可以实现资源共享,下面看例子: 79 package org.demo. 80 class MyThread implements Runnable{ 81 private int ticket=10; 82 public void run(){ 83 for(int i=0;i&20;i++){ 84 if(this.ticket&0){ 85 System.out.println(&卖票:ticket&+this.ticket--); 86 } 87 } 88 } 89 } 90 package org.demo. 91 public class RunnableTicket { 92 public static void main(String[] args) { 93 MyThread mt=new MyThread(); 94 new Thread(mt).start();//同一个 mt,然而在 Thread 中就不 可以,假如用同一 95 new Thread(mt).start();//个实例化对象 mt,就会浮现 异样 96 new Thread(mt).start(); 97 } 98 }; 固然现在程序中有三个线程,然而一共卖了10张票,也便是说 使用 Runnable 实现多线 程 可以达到资源共享目标 。 Runnable 接口和 Thread 中间的联络: 中间的联络: public class Thread extends Object implements Runnable 发现 Thread 类也是 Runnable 接口的子类 。 原文链接:http://blog.csdn.net/wwww1988600/article/details/7309070达内 java 学习笔记3
报名 Java 就业班,免费赠送基础班,名额有限,本 月火热报名中,欢迎有志之士...一般有三种方法,Thread,Runnable,Callable. Runnable 和 Callable 的区别是, (1...java中thread的start()和run()的区别_计算机软件及应用_IT/计算机_专业资料。...而不是开启一个线程 Thread t=new Thread(r);//调用了 Thread(Runnable ...23. 多线程(01)-线程与进程的区别、java中多线程的实现方式及区别、java线程...如果使用 Thread 会受到单继承的局限,所以一般实现多线程都是实现 Runnable 接口...它们都有哪些区别?相比而言,哪 一种方法更好呢? 在 Java 中,类仅支持单继承...(); } } class MutliThread implements Runnable{ private int ticket=100;//...Java 多线程多线程作为 Java 中很重要的一个知识点,在此还是有必要总结一下的...与实现 Runnable 接口创建线程方式相似,不同的地方在于 1 Thread thread = new...Java.1ang.Thread D、java.1ang.Runnable 9、下列说法中错误的一项是( )。 ...//实例化线程对象 //启动线程 3、 sleep() 和 wait() 有什么区别? 4、...java 多线程总结 java 中的多线程 在 java 中要想实现多线程,有两种手段,一...2144847.html Thread 和 Runnable 的区别: 如果一个类继承 Thread,则不适合资源...解决 Java 多线程中 11 个常见问题 1、线程是什么...例如:Thread t1=new Thread(); 就绪(runnable):...(this) 代码块 锁定的都是当前对象,不同 的只是...运行过程中允许同时并发执 行多个不同线程,这就使得一个程序能同时执行不同的...在 JAVA 中,Thread 类实 现了 Runnable 接口,因此 run 方法是通过实现接口 ...继承 java.lang.Thread,并重写它的 run()方法,将线程的执行主体放入其 中。 2. 实现 java.lang.Runnable 接口,实现它的 run()方法,并将线程的执行主体 放入...
All rights reserved Powered by
www.tceic.com
copyright &copyright 。文档资料库内容来自网络,如有侵犯请联系客服。浅析Java中Runnable和Thread的区别
转载 &更新时间:日 09:06:33 & 作者:孙佳敏
在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;Thread类是在java.lang包中定义的。接下来通过本文给大家浅析Java中Runnable和Thread的区别,一起看看吧
线程的起动并不是简单的调用了你的RUN方法,而是由一个线程调度器来分别调用你的所有线程的RUN方法,
我们普通的RUN方法如果没有执行完是不会返回的,也就是会一直执行下去,这样RUN方法下面的方法就不可能会执行了,可是线程里的RUN方法却不一样,它只有一定的CPU时间,执行过后就给别的线程了,这样反复的把CPU的时间切来切去,因为切换的速度很快,所以我们就感觉是很多线程在同时运行一样.
你简单的调用run方法是没有这样效果的,所以你必须调用Thread类的start方法来启动你的线程.所以你启动线程有两种方法
一是写一个类继承自Thread类,然后重写里面的run方法,用start方法启动线程
二是写一个类实现Runnable接口,实现里面的run方法,用new Thread(Runnable target).start()方法来启动
这两种方法都必须实现RUN方法,这样线程起动的时候,线程管理器好去调用你的RUN方法.
你的TestThread没有继承自Thread类,怎么可能会有start方法呢?
在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限。
下面看例子:
package org.thread.
class MyThread extends Thread{
public MyThread(String name) {
this.name =
public void run(){
for(int i=0;i&10;i++){
System.out.println("线程开始:"+this.name+",i="+i);
package org.thread.
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.
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.
class MyThread implements Runnable{
public MyThread(String name) {
this.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.
import org.runnable.demo.MyT
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.
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.
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.
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.
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接口的子类。
可见, 实现Runnable接口相对于继承Thread类来说,有如下显著的好处:
(1)适合多个相同程序代码的线程去处理同一资源的情况,把虚拟CPU(线程)同程序的代码,数据有效的分离,较好地体现了面向对象的设计思想。
(2)可以避免由于Java的单继承特性带来的局限。我们经常碰到这样一种情况,即当我们要将已经继承了某一个类的子类放入多线程中,由于一个类不能同时有两个父类,所以不能用继承Thread类的方式,那么,这个类就只能采用实现Runnable接口的方式了。
(3)有利于程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。当多个线程的执行代码来自同一个类的实例时,即称它们共享相同的代码。多个线程操作相同的数据,与它们的代码无关。当共享访问相同的对象是,即它们共享相同的数据。当线程被构造时,需要的代码和数据通过一个对象作为构造函数实参传递进去,这个对象就是一个实现了Runnable接口的类的实例。
以上所述是小编给大家介绍的Java中Runnable和Thread的区别,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具}

我要回帖

更多关于 java thread runnable 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信