Java基础加强之并发(二)常用的多线程实现方式
概述
常用的多线程实现方式有2种:
1. 继承Thread类
2. 实现Runnable接口
之所以说是常用的,是因为通过还可以通过JUC(java.util.concurrent)包中的线程池来实现多线程。关于线程池的内容,我们以后会详细介绍;现在,先对的Thread和Runnable进行了解。
Thread简介
Thread 是一个类。Thread本身就实现了Runnable接口。它的声明如下:
- public class Thread implements Runnable {}
Thread的作用是实现多线程。
ThreadTest.java 源码
- class MyThread extends Thread{
- private int ticket=10;
- public void run(){
- for(int i=0;i<20;i++){
- if(this.ticket>0){
- System.out.println(this.getName()+" 卖票:ticket"+this.ticket--);
- }
- }
- }
- };
- public class ThreadTest {
- public static void main(String[] args) {
- // 启动3个线程t1,t2,t3;每个线程各卖10张票!
- MyThread t1=new MyThread();
- MyThread t2=new MyThread();
- MyThread t3=new MyThread();
- t1.start();
- t2.start();
- t3.start();
- }
- }
运行结果
- 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
Runnable简介
Runnable 是一个函数式接口,该接口中只包含了一个run()方法。它的定义如下:
- @FunctionalInterface
- public interface Runnable {
- public abstract void run();
- }
Runnable的作用,实现多线程。我们可以定义一个类A实现Runnable接口;然后,通过new Thread(new A())等方式新建线程。
RunnableTest.java 源码
- class MyThread implements Runnable{
- private int ticket=10;
- public void run(){
- for(int i=0;i<20;i++){
- if(this.ticket>0){
- System.out.println(Thread.currentThread().getName()+" 卖票:ticket"+this.ticket--);
- }
- }
- }
- };
- public class RunnableTest {
- public static void main(String[] args) {
- MyThread mt=new MyThread();
- // 启动3个线程t1,t2,t3(它们共用一个Runnable对象),这3个线程一共卖10张票!
- Thread t1=new Thread(mt);
- Thread t2=new Thread(mt);
- Thread t3=new Thread(mt);
- t1.start();
- t2.start();
- t3.start();
- }
- }
运行结果
- 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
Thread和Runnable的异同点
Thread 和 Runnable 的相同点:都是“多线程的实现方式”。
Thread 和 Runnable 的不同点:
Thread 是类,而Runnable是接口;Thread本身是实现了Runnable接口的类。我们知道“一个类只能有一个父类,但是却能实现多个接口”,因此Runnable具有更好的扩展性。
此外,Runnable还可以用于“资源的共享”。即,多个线程都是基于某一个Runnable对象建立的,它们会共享Runnable对象上的资源。
通常,建议通过“Runnable”实现多线程!
Java基础加强之并发(二)常用的多线程实现方式的更多相关文章
- Java基础-考察JVM内部结构的常用工具介绍
Java基础-考察JVM内部结构的常用工具介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们可以通过jvisualvm.exe考察jvm内部结构.而jvisualvm.exe ...
- Java基础复习笔记系列 五 常用类
Java基础复习笔记系列之 常用类 1.String类介绍. 首先看类所属的包:java.lang.String类. 再看它的构造方法: 2. String s1 = “hello”: String ...
- JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题
JAVA基础再回首(二十五)--Lock锁的使用.死锁问题.多线程生产者和消费者.线程池.匿名内部类使用多线程.定时器.面试题 版权声明:转载必须注明本文转自程序猿杜鹏程的博客:http://blog ...
- java基础-引用数据类型之二维数组(Array)
java基础-引用数据类型之二维数组(Array) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 之前我们学习过了Java的一维数组,所谓的二维数组就是元素是一堆一维数组的数组,换 ...
- java基础知识一览(二)
一.java基础知识 1.一个文件中只能有一个public的类,因为他的类名要求和文件名相同. 2.classpath变量可以设置其它目录下的类. 例如:类文件所在目录是:F:\Javajdk,那么没 ...
- java基础梳理--朝花夕拾(二)
1.Java语言语法规则和文件格式: 第一个Java程序:/** 第一个Java程序:控制台输出Hello world!*/public class Test{ //访问修饰符 class关键词 ...
- JAVA基础——编程练习(二)
JAVA编程练习(二) 今天我为了巩固之前的java基础知识的学习,再次进行实战演习,编写了一个小小的java控制台程序,主要是运用java面向对象的思想来完成这个小项目. 一.项目背景介绍 根据所学 ...
- Java基础学习总结(二)
Java语言的特点: Java语言是简单的 Java语言是面向对象的 Java语言是跨平台(操作系统)的(即一次编写,到处运行) Java是高性能的 运行Java程序要安装和配置JDK jdk是什么? ...
- Java基础学习笔记十二 类、抽象类、接口作为方法参数和返回值以及常用API
不同修饰符使用细节 常用来修饰类.方法.变量的修饰符 public 权限修饰符,公共访问, 类,方法,成员变量 protected 权限修饰符,受保护访问, 方法,成员变量 默认什么也不写 也是一种权 ...
随机推荐
- Spring Boot学习笔记(六)mybatis配置多数据源
application.properties #数据库配置 #数据源类型 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource # ...
- 177. [USACO Jan07] 有限制的素数
177. [USACO Jan07] ★ 输入文件:qprime.in 输出文件:qprime.out 简单对比 时间限制:1 s 内存限制:128 MB Farmer John 开始 ...
- Keras & Theano 输出中间层结果
Keras & Theano get output of an intermediate layer 1.使用函数模型API,新建一个model,将输入和输出定义为原来的model的输入和想要 ...
- 大数据量报表APPLET打印分页传输方案
1 . 问题概述 当报表运算完成时,客户端经常需要调用润乾自带的runqianReport4Applet.jar来完成打印操作, 然而数据量比较大的时候,会导致无法加载完成,直至applet内存 ...
- 前端模块化方案全解(CommonJS/AMD/CMD/ES6)
模块化的开发方式可以提高代码复用率,方便进行代码的管理.通常一个文件就是一个模块,有自己的作用域,只向外暴露特定的变量和函数.目前流行的js模块化规范有CommonJS.AMD.CMD以及ES6的模块 ...
- Java XML SAX 解析注意
版权声明: 欢迎转载,但请保留文章原始出处 作者:GavinCT 出处:http://www.cnblogs.com/ct2011/p/4002738.html 什么时候可以把解析值赋给对象 一般从网 ...
- Object hashcode
java jvm怎么找到一个对象? 一个对象有一个独一无二的hashcode,这样就可以找到这个对象了. 但java 的hashcode 实现的不好,有可能两个不同的对象有一个相同的hashcode, ...
- mysql 免安装版
通过MySQL安装程序(.msi文件)来安装虽然简洁高效,但不够灵活,所以我们这里介绍免安装版. 1. 下载: 进入官网-->Downloads-->Community(社区版)--&g ...
- ExtJs 4.1.1 文件结构解析
- python及pandas,numpy等知识点技巧点学习笔记
python和java,.net,php web平台交互最好使用web通信方式,不要使用Jypython,IronPython,这样的好处是能够保持程序模块化,解耦性好 python允许使用'''.. ...