概述

常用的多线程实现方式有2种:

1. 继承Thread类

2. 实现Runnable接口

之所以说是常用的,是因为通过还可以通过JUC(java.util.concurrent)包中的线程池来实现多线程。关于线程池的内容,我们以后会详细介绍;现在,先对的Thread和Runnable进行了解。

Thread简介

Thread 是一个类。Thread本身就实现了Runnable接口。它的声明如下:

  1. public class Thread implements Runnable {}

Thread的作用是实现多线程。

ThreadTest.java 源码

  1. class MyThread extends Thread{
  2. private int ticket=10;
  3. public void run(){
  4. for(int i=0;i<20;i++){
  5. if(this.ticket>0){
  6. System.out.println(this.getName()+" 卖票:ticket"+this.ticket--);
  7. }
  8. }
  9. }
  10. };
  11.  
  12. public class ThreadTest {
  13. public static void main(String[] args) {
  14. // 启动3个线程t1,t2,t3;每个线程各卖10张票!
  15. MyThread t1=new MyThread();
  16. MyThread t2=new MyThread();
  17. MyThread t3=new MyThread();
  18. t1.start();
  19. t2.start();
  20. t3.start();
  21. }
  22. }

运行结果

  1. Thread-0 卖票:ticket10
  2. Thread-1 卖票:ticket10
  3. Thread-2 卖票:ticket10
  4. Thread-1 卖票:ticket9
  5. Thread-0 卖票:ticket9
  6. Thread-1 卖票:ticket8
  7. Thread-2 卖票:ticket9
  8. Thread-1 卖票:ticket7
  9. Thread-0 卖票:ticket8
  10. Thread-1 卖票:ticket6
  11. Thread-2 卖票:ticket8
  12. Thread-1 卖票:ticket5
  13. Thread-0 卖票:ticket7
  14. Thread-1 卖票:ticket4
  15. Thread-2 卖票:ticket7
  16. Thread-1 卖票:ticket3
  17. Thread-0 卖票:ticket6
  18. Thread-1 卖票:ticket2
  19. Thread-2 卖票:ticket6
  20. Thread-2 卖票:ticket5
  21. Thread-2 卖票:ticket4
  22. Thread-1 卖票:ticket1
  23. Thread-0 卖票:ticket5
  24. Thread-2 卖票:ticket3
  25. Thread-0 卖票:ticket4
  26. Thread-2 卖票:ticket2
  27. Thread-0 卖票:ticket3
  28. Thread-2 卖票:ticket1
  29. Thread-0 卖票:ticket2
  30. Thread-0 卖票:ticket1

Runnable简介

Runnable 是一个函数式接口,该接口中只包含了一个run()方法。它的定义如下:

  1. @FunctionalInterface
  2. public interface Runnable {
  3. public abstract void run();
  4. }

Runnable的作用,实现多线程。我们可以定义一个类A实现Runnable接口;然后,通过new Thread(new A())等方式新建线程。

RunnableTest.java 源码

  1. class MyThread implements Runnable{
  2. private int ticket=10;
  3. public void run(){
  4. for(int i=0;i<20;i++){
  5. if(this.ticket>0){
  6. System.out.println(Thread.currentThread().getName()+" 卖票:ticket"+this.ticket--);
  7. }
  8. }
  9. }
  10. };
  11.  
  12. public class RunnableTest {
  13. public static void main(String[] args) {
  14. MyThread mt=new MyThread();
  15.  
  16. // 启动3个线程t1,t2,t3(它们共用一个Runnable对象),这3个线程一共卖10张票!
  17. Thread t1=new Thread(mt);
  18. Thread t2=new Thread(mt);
  19. Thread t3=new Thread(mt);
  20. t1.start();
  21. t2.start();
  22. t3.start();
  23. }
  24. }

运行结果

  1. Thread-0 卖票:ticket10
  2. Thread-2 卖票:ticket8
  3. Thread-1 卖票:ticket9
  4. Thread-2 卖票:ticket6
  5. Thread-0 卖票:ticket7
  6. Thread-2 卖票:ticket4
  7. Thread-1 卖票:ticket5
  8. Thread-2 卖票:ticket2
  9. Thread-0 卖票:ticket3
  10. Thread-1 卖票:ticket1

Thread和Runnable的异同点

Thread 和 Runnable 的相同点:都是“多线程的实现方式”。
Thread 和 Runnable 的不同点:
Thread 是类,而Runnable是接口;Thread本身是实现了Runnable接口的类。我们知道“一个类只能有一个父类,但是却能实现多个接口”,因此Runnable具有更好的扩展性。
此外,Runnable还可以用于“资源的共享”。即,多个线程都是基于某一个Runnable对象建立的,它们会共享Runnable对象上的资源。
通常,建议通过“Runnable”实现多线程!

Java基础加强之并发(二)常用的多线程实现方式的更多相关文章

  1. Java基础-考察JVM内部结构的常用工具介绍

    Java基础-考察JVM内部结构的常用工具介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们可以通过jvisualvm.exe考察jvm内部结构.而jvisualvm.exe ...

  2. Java基础复习笔记系列 五 常用类

    Java基础复习笔记系列之 常用类 1.String类介绍. 首先看类所属的包:java.lang.String类. 再看它的构造方法: 2. String s1 = “hello”: String ...

  3. JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题

    JAVA基础再回首(二十五)--Lock锁的使用.死锁问题.多线程生产者和消费者.线程池.匿名内部类使用多线程.定时器.面试题 版权声明:转载必须注明本文转自程序猿杜鹏程的博客:http://blog ...

  4. java基础-引用数据类型之二维数组(Array)

    java基础-引用数据类型之二维数组(Array) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 之前我们学习过了Java的一维数组,所谓的二维数组就是元素是一堆一维数组的数组,换 ...

  5. java基础知识一览(二)

    一.java基础知识 1.一个文件中只能有一个public的类,因为他的类名要求和文件名相同. 2.classpath变量可以设置其它目录下的类. 例如:类文件所在目录是:F:\Javajdk,那么没 ...

  6. java基础梳理--朝花夕拾(二)

    1.Java语言语法规则和文件格式: 第一个Java程序:/** 第一个Java程序:控制台输出Hello world!*/public class Test{    //访问修饰符 class关键词 ...

  7. JAVA基础——编程练习(二)

    JAVA编程练习(二) 今天我为了巩固之前的java基础知识的学习,再次进行实战演习,编写了一个小小的java控制台程序,主要是运用java面向对象的思想来完成这个小项目. 一.项目背景介绍 根据所学 ...

  8. Java基础学习总结(二)

    Java语言的特点: Java语言是简单的 Java语言是面向对象的 Java语言是跨平台(操作系统)的(即一次编写,到处运行) Java是高性能的 运行Java程序要安装和配置JDK jdk是什么? ...

  9. Java基础学习笔记十二 类、抽象类、接口作为方法参数和返回值以及常用API

    不同修饰符使用细节 常用来修饰类.方法.变量的修饰符 public 权限修饰符,公共访问, 类,方法,成员变量 protected 权限修饰符,受保护访问, 方法,成员变量 默认什么也不写 也是一种权 ...

随机推荐

  1. Spring Boot学习笔记(六)mybatis配置多数据源

    application.properties #数据库配置 #数据源类型 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource # ...

  2. 177. [USACO Jan07] 有限制的素数

    177. [USACO Jan07] ★   输入文件:qprime.in   输出文件:qprime.out   简单对比 时间限制:1 s   内存限制:128 MB Farmer John 开始 ...

  3. Keras & Theano 输出中间层结果

    Keras & Theano get output of an intermediate layer 1.使用函数模型API,新建一个model,将输入和输出定义为原来的model的输入和想要 ...

  4. 大数据量报表APPLET打印分页传输方案

     1 . 问题概述 当报表运算完成时,客户端经常需要调用润乾自带的runqianReport4Applet.jar来完成打印操作, 然而数据量比较大的时候,会导致无法加载完成,直至applet内存 ...

  5. 前端模块化方案全解(CommonJS/AMD/CMD/ES6)

    模块化的开发方式可以提高代码复用率,方便进行代码的管理.通常一个文件就是一个模块,有自己的作用域,只向外暴露特定的变量和函数.目前流行的js模块化规范有CommonJS.AMD.CMD以及ES6的模块 ...

  6. Java XML SAX 解析注意

    版权声明: 欢迎转载,但请保留文章原始出处 作者:GavinCT 出处:http://www.cnblogs.com/ct2011/p/4002738.html 什么时候可以把解析值赋给对象 一般从网 ...

  7. Object hashcode

    java jvm怎么找到一个对象? 一个对象有一个独一无二的hashcode,这样就可以找到这个对象了. 但java 的hashcode 实现的不好,有可能两个不同的对象有一个相同的hashcode, ...

  8. mysql 免安装版

    通过MySQL安装程序(.msi文件)来安装虽然简洁高效,但不够灵活,所以我们这里介绍免安装版. 1.  下载: 进入官网-->Downloads-->Community(社区版)--&g ...

  9. ExtJs 4.1.1 文件结构解析

  10. python及pandas,numpy等知识点技巧点学习笔记

    python和java,.net,php web平台交互最好使用web通信方式,不要使用Jypython,IronPython,这样的好处是能够保持程序模块化,解耦性好 python允许使用'''.. ...