之所以说是常用的,是因为通过还可以通过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. 12个强大的Web服务测试工具

    在过去的几年中,web服务或API的普及和使用有所增加. web服务或API是程序或软件组件的集合,可以帮助应用程序进行交互或通过形成其他应用程序或服务器之间的连接执行一些进程/事务处理.基本上有两种 ...

  2. 【转】VS2013编译libjpeg库

    原文地址:http://blog.csdn.net/weixinhum/article/details/42718959 现在,很多图像处理工具和开源库都给出了图像解码的函数接口,然而有时这些接口并不 ...

  3. poj 1564 Sum It Up【dfs+去重】

    Sum It Up Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6682   Accepted: 3475 Descrip ...

  4. Qt 智能指针学习(7种指针)

    Qt 智能指针学习 转载自:http://blog.csdn.net/dbzhang800/article/details/6403285 从内存泄露开始? 很简单的入门程序,应该比较熟悉吧 ^_^ ...

  5. javascript 函数参数

    1.javascript函数参数的个数以及类型没有强制规定,调用时不必严格按照函数的参数或类型,函数的参数只是在调用函数的时候提供了便利,但不是必须的! 2.参数在javascript内部是用数组ar ...

  6. Linux编程---线程

    首先说一下线程的概念.事实上就是运行在进程的上下文环境中的一个运行流.普通进程仅仅有一条运行流,可是线程提供了多种运行的路径并行的局面. 同一时候,线程还分为核心级线程和用户级线程.主要差别在属于核内 ...

  7. Linux kernel驱动相关抽象概念及其实现 之“linux设备模型kobject,kset,ktype”

    kobject,kset,ktype三个很重要的概念贯穿Linux内核驱动架构,特转载一篇博文: (转载自http://blog.csdn.net/gdt_a20/article/details/64 ...

  8. UVA 10465 Homer Simpson(dp + 完全背包)

    Problem C: Homer Simpson Time Limit: 3 seconds Memory Limit: 32 MB Homer Simpson, a very smart guy, ...

  9. CentOS+Nginx+PHP+MySQL详细配置(图解)

    原文地址: http://www.jb51.net/article/26597.htm CentOS+Nginx+PHP+MySQL详细配置(带有图解),需要的朋友可以参考下.   一.安装MySQL ...

  10. sql语句游标的写法

    当循环查找一张表的信息时,我们得写一张游标来对每条信息进行操作,具体格式如下 DECLARE @fitemid int DECLARE #point_cursor CURSORFORSELECT fi ...