之所以说是常用的,是因为通过还可以通过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. Google财经

    本博文的主要内容有 .Google财经的介绍   .市场    .新闻 .投资组合新闻   .投资组合 1.Google财经的介绍 https://zh.wikipedia.org/wiki/Goog ...

  2. 网络子系统42_ip协议处理函数_数据帧的接收

    //向协议栈注册l3处理函数 1.1 void dev_add_pack(struct packet_type *pt) { int hash; //ptype_all ptype_base共用一把锁 ...

  3. 364. Nested List Weight Sum II

    这个题做了一个多小时,好傻逼. 显而易见计算的话必须知道当前层是第几层,因为要乘权重,想要知道是第几层又必须知道最高是几层.. 用了好久是因为想ONE PASS,尝试过遍历的时候构建STACK,通过和 ...

  4. [RxJS] Filtering operators: takeUntil, takeWhile

    take(), takeLast(), first(), last(), those opreators all take number or no param. takeUtil and takeW ...

  5. android 49 广播接收者中启动其他组件

    main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" andro ...

  6. Linux命令之dot - 绘制DOT语言脚本描述的图形

    本文链接:http://codingstandards.iteye.com/blog/840055 用途说明 Graphviz (Graph Visualization Software的缩写)是一个 ...

  7. anzhaung

    http://search.newhua.com/search_list.php?searchsid=1&searchname=Setu

  8. CentOS 6.3 源码安装LAMP(Linux+Apache+Mysql+Php)环境

    一.简介 什么是LAMP LAMP是一种Web网络应用和开发环境,是Linux, Apache, MySQL, Php/Perl的缩写,每一个字母代表了一个组件,每个组件就其本身而>言都是在它所 ...

  9. svn命令的使用

    1.检出svn  co  http://路径(目录或文件的全路径) [本地目录全路径] --username 用户名 --password 密码svn  co  svn://路径(目录或文件的全路径) ...

  10. php 编译安装的一个 configure 配置

    yum -y install libmcrypt-devel mhash-devel libxslt-devel libjpeg libjpeg-devel libpng libpng-devel f ...