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

      Just a Hook 题目大意:原来有N个铜棍, 一个人有种能力可以把一个区间的棍变成铜,银或者金的,价值分别是1,2,3, 最后求出总价值,没啥好说的,赤裸裸的线段树: Time Limit ...

  2. highcharts动态获取数据生成图表问题

    动态获取数据说白点就是从后台传值到前台,前台把这些值赋值给x轴与y轴(这里指的是你X轴与Y轴都是变化的数据,如果你的X轴是固定的,像时间等等的那就另说).  柱状图的动态传值: //获取后台数据 va ...

  3. 快速设计一个简单的WPF串口上位机

    最近一直在学习UWP,其中有的技术参考了WPF,所以又回头再来学习WPF,感觉学的东西很杂,必须记录一下,不然时间长了还得忘掉,于是申请开始写博客,将学习的心得记录一下,以备后用.这次是因为公司内训, ...

  4. Activity透明/半透明效果的设置transparent(两种实现方法)

    两种方法实现Activity透明/半透明效果的设置,代码思路很有调理,感兴趣的朋友可以参考下,希望本文可以帮助到你   方法一:res/values文件夹下建立styles.xml: 复制代码代码如下 ...

  5. poj 2240 Arbitrage (Floyd)

    链接:poj 2240 题意:首先给出N中货币,然后给出了这N种货币之间的兑换的兑换率. 如 USDollar 0.5 BritishPound 表示 :1 USDollar兑换成0.5 Britis ...

  6. malloc函数具体解释

    一.原型:extern void *malloc(unsigned int num_bytes); 头文件:#include <malloc.h> 或 #include <alloc ...

  7. OpenSSL使用指南

    OpenSSL使用指南 1     介绍 OpenSSL是使用非常广泛的SSL的开源实现.由于其中实现了为SSL所用的各种加密算法,因此OpenSSL也是被广泛使用的加密函数库. 1.1   SSL ...

  8. [RxJS] Combination operator: zip

    CombineLatest and withLatestFrom are both AND-style combination operators. In this lesson, we will l ...

  9. Red Hat Enterprise Linux 6安装步骤

    首先,准备安装环境,此次实验是在VMware Workstation虚拟机环境下来实现的,下面就开始安装: 点击Create a New Vitrual Machine来新建一个虚拟机,选择自定义安装 ...

  10. PHP编译错误Don't know how to define struct flock on this system, set --enable-opcache=no

    编辑 /etc/ld.so.conf 加入 /usr/local/lib 再执行 ldconfig