之所以说是常用的,是因为通过还可以通过java.util.concurrent包中的线程池来实现多线程。关于线程池的内容,我们以后会详细介绍;现在,先对的Thread和Runnable进行了解。本章内容包括:
  Thread和Runnable的简介
  Thread和Runnable的异同点
  Thread和Runnable的多线程的示例
  Thread和Runnable简介
  Runnable 是一个接口,该接口中只包含了一个run()方法。它的定义如下:
  public interface Runnable {
  public abstract void run();
  }
  Runnable的作用,实现多线程。我们可以定义一个类A实现Runnable接口;然后,通过new Thread(new A())等方式新建线程。
  Thread 是一个类。Thread本身就实现了Runnable接口。它的声明如下:
  public class Thread implements Runnable {}
  Thread的作用,实现多线程。
  Thread和Runnable的异同点
  Thread 和 Runnable 的相同点:都是“多线程的实现方式”。
  Thread 和 Runnable 的不同点:
  Thread 是类,而Runnable是接口;Thread本身是实现了Runnable接口的类。我们知道“一个类只能有一个父类,但是却能实现多个接口”,因此Runnable具有更好的扩展性。
  此外,Runnable还可以用于“资源的共享”。即,多个线程都是基于某一个Runnable对象建立的,它们会共享Runnable对象上的资源。
  通常,建议通过“Runnable”实现多线程!
  Thread和Runnable的多线程示例
  1. Thread的多线程示例
  下面通过示例更好的理解Thread和Runnable,借鉴网上一个例子比较具有说服性的例子。
  
  1 // ThreadTest.java 源码
  2 class MyThread extends Thread{
  3 private int ticket=10;
  4 public void run(){
  5 for(int i=0;i<20;i++){
  6 if(this.ticket>0){
  7 System.out.println(this.getName()+" 卖票:ticket"+this.ticket--);
  8 }
  9 }
  10 }
  11 };
  12
  13 public class ThreadTest {
  14 public static void main(String[] args) {
  15 // 启动3个线程t1,t2,t3;每个线程各卖10张票!
  16 MyThread t1=new MyThread();
  17 MyThread t2=new MyThread();
  18 MyThread t3=new MyThread();
  19 t1.start();
  20 t2.start();
  21 t3.start();
  22 }
  23 }
 运行结果:
  
  Thread-0 卖票:ticket10
  Thread-1 卖票:ticket10
  Thread-2 卖票:ticket10
  Thread-1 卖票:ticket9
  Thread-0 卖票:ticket9
  Thread-1 卖票:ticket8
  Thread-2 卖票:ticket9
  Thread-1 卖票:ticket7
  Thread-0 卖票:ticket8
  Thread-1 卖票:ticket6
  Thread-2 卖票:ticket8
  Thread-1 卖票:ticket5
  Thread-0 卖票:ticket7
  Thread-1 卖票:ticket4
  Thread-2 卖票:ticket7
  Thread-1 卖票:ticket3
  Thread-0 卖票:ticket6
  Thread-1 卖票:ticket2
  Thread-2 卖票:ticket6
  Thread-2 卖票:ticket5
  Thread-2 卖票:ticket4
  Thread-1 卖票:ticket1
  Thread-0 卖票:ticket5
  Thread-2 卖票:ticket3
  Thread-0 卖票:ticket4
  Thread-2 卖票:ticket2
  Thread-0 卖票:ticket3
  Thread-2 卖票:ticket1
  Thread-0 卖票:ticket2
  Thread-0 卖票:ticket1
  
  结果说明:
  (01) MyThread继承于Thread,它是自定义个线程。每个MyThread都会卖出10张票。
  (02) 主线程main创建并启动3个MyThread子线程。每个子线程都各自卖出了10张票。
  2. Runnable的多线程示例托福答案 www.jszdsy.com
  下面,我们对上面的程序进行修改。通过Runnable实现一个接口,从而实现多线程。
  
  1 // RunnableTest.java 源码
  2 class MyThread implements Runnable{
  3 private int ticket=10;
  4 public void run(){
  5 for(int i=0;i<20;i++){
  6 if(this.ticket>0){
  7 System.out.println(Thread.currentThread().getName()+" 卖票:ticket"+this.ticket--);
  8 }
  9 }
  10 }
  11 };
  12
  13 public class RunnableTest {
  14 public static void main(String[] args) {
  15 MyThread mt=new MyThread();
  16
  17 // 启动3个线程t1,t2,t3(它们共用一个Runnable对象),这3个线程一共卖10张票!
  18 Thread t1=new Thread(mt);
  19 Thread t2=new Thread(mt);
  20 Thread t3=new Thread(mt);
  21 t1.start();
  22 t2.start();
  23 t3.start();
  24 }
  25 }
  
  运行结果:
  
  Thread-0 卖票:ticket10
  Thread-2 卖票:ticket8
  Thread-1 卖票:ticket9
  Thread-2 卖票:ticket6
  Thread-0 卖票:ticket7
  Thread-2 卖票:ticket4
  Thread-1 卖票:ticket5
  Thread-2 卖票:ticket2
  Thread-0 卖票:ticket3
  Thread-1 卖票:ticket1
  
  结果说明:
  (01) 和上面“MyThread继承于Thread”不同;这里的MyThread实现了Thread接口。
  (02) 主线程main创建并启动3个子线程,而且这3个子线程都是基于“mt这个Runnable对象”而创建的。运行结果是这3个子线程一共卖出了10张票。这说明它们是共享了MyThread接口的。

Java多线程:常用的实现多线程的两种方式的更多相关文章

  1. JAVA发送http GET/POST请求的两种方式+JAVA http 请求手动配置代理

    java发送http get请求,有两种方式. 第一种用URLConnection: public static String get(String url) throws IOException { ...

  2. 多线程之线程间协作的两种方式:wait、notify、notifyAll和Condition

    Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...

  3. java中读取配置文件ResourceBundle和Properties两种方式比较

    今天在开发的时候,需要把一些信息放到配置文件中,方便后续的修改,注意到用的是ResourceBundle读取配置文件的方式,记得之前也见过使用Properties的方式,就比较好奇这两种方式的区别,网 ...

  4. java多线程机制1(线程创建的两种方式)

    进程:正在运行的程序.(即程序在内存中开辟了一片空间) 线程:是进程的执行单元. 一个进程至少包含了一个多个线程. 多线程是不是可以提高效率:多线程可以合理的利用系统的资源,提高效率是相对的.因为cp ...

  5. java后台处理解析json字符串的两种方式

    简单说一下背景 上次后端通过模拟http请求百度地图接口,得到的是一个json字符串,而我只需要其中的某个key对应的value. 当时我是通过截取字符串取的,后来觉得不太合理,今天整理出了两种处理解 ...

  6. 不使用spring的情况下用java原生代码操作mongodb数据库的两种方式

    由于更改了mongodb3.0数据库的密码,导致这几天storm组对数据进行处理的时候,一直在报mongodb数据库连接不上的异常.   主要原因实际上是和mongodb本身无关的,因为他们改的是配置 ...

  7. 【linux】linux查看资源任务管理器,使用top命令 + 查看java进程下的线程数量【两种方式】

    ================================ 详解:https://blog.csdn.net/achenyuan/article/details/77867661 ======= ...

  8. Java中创建String的两种方式

    1.在Java中,创建一个字符串有两种方式 String x = "abc";String y = new String("abc"); 这两种方式有什么区别呢 ...

  9. Java实现多线程的两种方式

    实现多线程的两种方式: 方式1: 继承Thread类 A: 自定义MyThread类继承Thread类 B: 在MyThread类中重写run() C: 创建MyThread类的对象 D: 启动线程对 ...

  10. Java中实现多线程的两种方式之间的区别

    Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线 ...

随机推荐

  1. Apache 一台主机绑定多个域名及虚拟主机

    今天研究了下Apache下如何使用一台主机绑定多个域名且使用80端口.说白了就是在一台主机上运行多个网站,并且网站域名都是使用的80端口. 具体方法如下: 1.进入Apache conf目录,找到ht ...

  2. Windows宿主机访问Ubuntu中mysql数据库笔记

    1.网络 既然要远程ubuntu的系统.那么首先是两个网络是不是在一个网段.能不能ping的通? a)  Windows电脑上--cmd 打开命令窗口.键入:ipconfig 命令.查看主机IP. b ...

  3. CentOS让root用户可以SSH登录

    一.说明     Solaris 10 出于安全原因,默认参数很严格,禁止root用户直接使用ssh登陆 二.处理     1.可以先用非root的帐户,登陆到ssh后,su成root     2.如 ...

  4. ubuntu下管理android手机

    1.安装adb apt-get install android-tools-adb 2.配置 1)运行lsusb Bus 001 Device 002: ID 8087:0024 Intel Corp ...

  5. Java 23种设计模式详尽分析与实例解析之一--创建型模式

    面向对象的设计原则 常用的面向对象设计原则包括7个,这些原则并不是独立存在的,它们相互依赖.互为补充. Java设计模式 创建型模式 简单工厂模式 模式动机: 考虑一个简单的软件应用场景,一个软件系统 ...

  6. 搜狗输入法皮肤安装 分类: windows常用小技巧 2014-05-04 15:10 172人阅读 评论(0) 收藏

    第一步: 下载皮肤,皮肤是.ssf格式的. 第二步: 找到安装目录:(以我的为例) D:\软件\搜狗输入法\SogouInput\7.1.0.1652\AllSkin: 把下载的皮肤剪切(或复制)到此 ...

  7. Windows Live Writer的Markdown插件MarkdownInLiveWriter支持语法高亮了

    我前几天开发的Windows Live Writer的Markdown的插件MarkdownInLiveWriter支持语法高亮了.参见下图: 基本上就是把我的另一个插件CodeInLiveWrite ...

  8. 关于在VMware上装lFEDORA系统

    VMware虚拟机启动当中某个操作系统的时候,会出现如下提示 Cannot connect virtual device floppy0. No corresponding device is ava ...

  9. QT 读写sqllite数据库

    QT 读写sqllite数据库 分类: 技术资料2014-04-10 10:39 84人阅读 评论(0) 收藏 举报 #include <QtGui/QApplication> #incl ...

  10. [转] 三步将你的 React Native 项目运行在 Web 浏览器上面

    React Native 的出现,让前端工程师拥有了使用 JavaScript 编写原生 APP 的能力.相比之前的 Web app 来说,对于性能和用户体验提升了非常多. 但是 React Nati ...