之所以说是常用的,是因为通过还可以通过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. 【转】Gabor 入门

    Computer Vision Tutorials Search Primary Menu Skip to content Tutorials Search for:   Gabor Filters ...

  2. 实现网页页面跳转的几种方法大全(meta标签、js实现、php实现)

    1.meta标签实现 只需在head里加上下面这一句就行了,在当前页面停留0.1秒后跳转到目标页面  代码如下 复制代码 1 <meta http-equiv="refresh&quo ...

  3. MySQL 面试基础

    相关:http://blog.csdn.net/u013252072/article/details/52912385          http://blog.csdn.net/zhangliang ...

  4. c#基础语言编程-装箱和拆箱

    引言 为什么有装箱和拆箱,两者起到什么作用?NET的所有类型都是由基类System.Object继承过来的,包括最常用的基础类型:int, byte, short,bool等等,就是说所有的事物都是对 ...

  5. ELK初学搭建(kibana)

    ELK初学搭建(kibana) elasticsearch logstash kibana ELK初学搭建 kibana 1.环境准备 centos6.8_64 mini IP:192.168.10. ...

  6. 开发期间的GWT设置---加快编译速度

    随着项目功能的完善,GWT模块(Module)越来越多,当要以web模式编译给测试组使用时,编译的总时间越来越多,我的机器编译完8个模块,需要10分钟左右. 抽空研究了一下GWT的编译参数和GWT编译 ...

  7. FreeMarker 自己定义指令(三)

    1. 模板文件 test04.ftl foo <@customUpper> bar f <#-- 这里同意使用全部的 FTL --> <#list ["red& ...

  8. android 54 播放音视频

    mainActivity: package com.sxt.day07_09; import java.util.ArrayList; import java.util.HashMap; import ...

  9. Qt 学习之路 :信号槽

    信号槽是 Qt 框架引以为豪的机制之一.熟练使用和理解信号槽,能够设计出解耦的非常漂亮的程序,有利于增强我们的技术设计能力. 所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被 ...

  10. iOS-Storyboad动态刷新

    iOS-Storyboad动态刷新 什么叫做Storyboard动态刷新 在项目开发中,如果可以在xib(storyboard)中,动态显示运行效果图,那么实在是太爽了.在Xcode 6之后就为我们提 ...