摘要:

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

用法:

Thread:

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;import org.thread.demo.MyThread;public class ThreadDemo01 {  public static void main(String[] args) {  MyThread mt1=new MyThread("线程a");  MyThread mt2=new MyThread("线程b");  mt1.run();  mt2.run();  }
} 

但是,此时结果很有规律,先第一个对象执行,然后第二个对象执行,并没有相互运行。

public class ThreadDemo01 {  public static void main(String[] args) {  MyThread mt1=new MyThread("线程a");  MyThread mt2=new MyThread("线程b");  mt1.start();  mt2.start();  }
}

这样程序可以正常完成交互式运行。

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);  }  }
}

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定义的子类中没有start()方法,只有Thread类中才有。Thread类,有一个构造方法:public Thread(Runnable targer)接受Runnable的子类实例,也就是说可以通过Thread类来启动Runnable实现的多线程。

区别:

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();//没有达到资源共享
    }
}

Rannable:

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实现多线程可以达到资源共享目的。

 原文:

追寻.java线程系列---Runnable和Thread的区别[2012-03-01](2014-07-11).http://blog.csdn.net/wwww1988600/article/details/7309070

Java多线程中的Runnable和Thread相关推荐

  1. java多线程中的join方法详解

    java多线程中的join方法详解 方法Join是干啥用的? 简单回答,同步,如何同步? 怎么实现的? 下面将逐个回答. 自从接触Java多线程,一直对Join理解不了.JDK是这样说的:join p ...

  2. Java多线程中使用ReentrantLock、synchronized加锁 简单举例

    Java多线程中使用ReentrantLock.synchronized加锁 简单举例 public class Demo {final static Lock lock = new Reentran ...

  3. java 多线程的单例模式,Java多线程中的单例模式两种实现方式

    Java多线程中的单例模式 一.在多线程环境下创建单例 方式一: package com.ietree.multithread.sync; public class Singletion { priv ...

  4. java多线程同步与死锁_浅析Java多线程中的同步和死锁

    Value Engineering 1基于Java的多线程 多线程是实现并发机制的一种有效手段,它允许编程语言在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间相互独立,且与进程一样拥有独立 ...

  5. Java多线程中的ThreadLocal,可继承,可修改

    Java多线程中的ThreadLocal,可继承,可修改. package test;import java.util.Date;public class InheritableThreadLocal ...

  6. java多线程中的死锁、活锁、饥饿、无锁都是什么鬼?

    转载自 java多线程中的死锁.活锁.饥饿.无锁都是什么鬼? 死锁.活锁.饥饿是关于多线程是否活跃出现的运行阻塞障碍问题,如果线程出现了这三种情况,即线程不再活跃,不能再正常地执行下去了. 死锁 死锁 ...

  7. Java多线程中static变量的使用

    Java中 没处理好同步 导致两个线程同时为一个static变量赋值 会导致什么后果? Java中 没处理好同步 导致两个线程同时为一个static变量赋值 会导致什么后果?仅仅是多耗资源还是会引发异 ...

  8. 【Java之多线程(二)】(***重要***)Java多线程中常见方法的区别,如object.wait()和Thread.sleep()的区别等

    1.Java中Thread和Runnable的区别??? 区别: 在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处: 避免点 ...

  9. JAVA多线程之Runnable和Thread比较

    在我们开发的过程中常常会碰到多线程的问题,对于多线程的实现方式主要有两种:实现Runnable接口.继承Thread类.对于这两种多线程的实现方式也是有着一些差异.既然实现了多线程那必然离不开管理这些 ...

最新文章

  1. android除去标题栏或全屏
  2. 【干货】用Axure做原型,一秒钟提高效率的必知技巧总结
  3. 纪中B组模拟赛总结(2020.2.3)
  4. 二级省市联动下拉菜单
  5. 推荐一份 Google 面试指南
  6. wordpress电商独立站模板
  7. 怎样用52单片机做计算机,利用串口小助手实现AT89S52单片机简易计算器完整程序(Keil)...
  8. Laravel:关于with用法 OneByOne 关联(避坑)
  9. unbuntu下载编译chromium
  10. 移动安全工具-jadx
  11. Echarts icon图标 默认样式 样式总结
  12. 照片秒变艺术肖像画,Github标星5.2K!
  13. VC2008 NewControl 示例
  14. torch.repeat()与numpy.repeat()和 numpy.tile()比较
  15. 信仰:生或者死——读海子、史铁生
  16. 【软件测试】测试人我明明测了,生产环境还出问题?又出幺蛾子......
  17. 跨国并购数据库:SDC跨国数据库、Thomson数据库、A股上市公司并购数据库等多指标数据(4W+)
  18. 苹果研发卫星技术,Facebook自建操作系统,Uber推空中出租车 | 科技前沿周报
  19. 如何准备、制作和演讲presentation,以及应该注意的问题
  20. python连接oracle报错DPI-1047

热门文章

  1. IETester-IE兼容性测试工具
  2. 树莓派私有云(OwnCloud)搭建(三) OwnCloud安装
  3. 第29月第21天 ios android curl
  4. 软工作业3: 词频统计
  5. Go语言构建json和解析json实例
  6. 一个Web页面的问题分析
  7. 黑马程序员——集合框架(二)
  8. android Button背景高度被拉伸问题--解决方案
  9. Linux 中ifconfig和ip addr命令查看不到ip解决方法
  10. Windows2008 R2下,DCOM配置里的属性灰色不可用的解决方法