1 继承Thread类,重写run方法。Thread类实现了Runnable接口。

  2 实现Runnable接口,重写run方法。相比于继承Thread类,可以避免单继承的缺陷和实现资源共享。

  举例:假设两个窗口在卖5张火车票。

  继承Thread类方式:

 public class SharedDataThreadDemo {
public static void main(String[] args) {
TicketThread t1 = new TicketThread("1号窗口");
t1.start(); TicketThread t2 = new TicketThread("2号窗口");
t2.start();
}
} class TicketThread extends Thread {
private int ticket = 5; public TicketThread(String name) {
super(name);
} @Override
public void run() {
while(true) {
System.out.println(this.getName() + ":" + (ticket--));
if(ticket < 1) {
break;
}
}
}
}

  结果如下:

 1号窗口:5
2号窗口:5
1号窗口:4
2号窗口:4
1号窗口:3
2号窗口:3
1号窗口:2
2号窗口:2
1号窗口:1
2号窗口:1

  每个线程相互独立,不共享资源,每个线程各自卖了5张票,总共卖出10张票。如果真卖票,就有问题了。

  实现Runnable接口方式:

 public class SharedDataThreadDemo {
public static void main(String[] args) {
TicketRunnable ticketRunnable = new TicketRunnable();
Thread t1 = new Thread(ticketRunnable, "1号窗口");
t1.start(); Thread t2 = new Thread(ticketRunnable, "2号窗口");
t2.start();
}
} class TicketRunnable implements Runnable {
private int ticket = 5; @Override
public void run() {
while(true) {
System.out.println(Thread.currentThread().getName() + ":" + (ticket--));
if(ticket < 1) {
break;
}
}
} }

  结果如下:

2号窗口:4
1号窗口:5
2号窗口:3
1号窗口:2
2号窗口:1

  每个线程共享了实现Runnable接口的类实例资源即对象ticketRunnable的火车票资源,共卖出10张票。

  3 实现Callable接口,重写call方法,有返回值。

  4 使用实现了Executor接口的ThreadPoolExecutor来创建线程池。

  参考资料

  创建线程有几种不同的方式?你喜欢哪一种?为什么?

  Java中Runnable和Thread的区别

Java 多线程 创建线程的4种方式的更多相关文章

  1. Java多线程——创建线程的两种方式

    创建线程方式一:继承Thread类. 步骤:1,定义一个类继承Thread类.2,覆盖Thread类中的run方法.3,直接创建Thread的子类对象创建线程.4,调用start方法开启线程并调用线程 ...

  2. Java多线程-----创建线程的几种方式

       1.继承Thread类创建线程 定义Thread类的子类,并重写该类的run()方法,该方法的方法体就是线程需要完成的任务,run()方法也称为线程执行体 创建Thread子类的实例,也就是创建 ...

  3. 0036 Java学习笔记-多线程-创建线程的三种方式

    创建线程 创建线程的三种方式: 继承java.lang.Thread 实现java.lang.Runnable接口 实现java.util.concurrent.Callable接口 所有的线程对象都 ...

  4. Java中创建线程的两种方式

    创建线程的第一种方式: 创建一个类继承Thread 重写Thread中的run方法 (创建线程是为了执行任务 任务代码必须有存储位置,run方法就是任务代码的存储位置.) 创建子类对象,其实就是在创建 ...

  5. Java值创建线程的两种方式对比

    在Java中创建线程的方式有两种,第一种是直接继承Thead类,另一种是实现Runable接口.那么这两种方式孰优孰劣呢? 采用继承Thead类实现多线程: 优势:编写简单,如果需要访问当前线程,只需 ...

  6. Java中创建线程的三种方式以及区别

    在java中如果要创建线程的话,一般有3种方法: 继承Thread类: 实现Runnable接口: 使用Callable和Future创建线程. 1. 继承Thread类 继承Thread类的话,必须 ...

  7. Java中创建线程的三种方式及其优缺点

    1.自定义一个继承Thread的类,由于Java的单继承特性,限制了该类的扩展性. 2.实现Runnable接口,重写run()方法. 3.实现Callable接口,重写call方法.线程执行体可以有 ...

  8. 【Java】创建线程对象两种方式

    1.继承Thread类,重载run方法: Thread t = new Thread(new Runnable() { @Override public void run() { // TODO Au ...

  9. Java并发编程:Java创建线程的三种方式

    目录 引言 创建线程的三种方式 一.继承Thread类 二.实现Runnable接口 三.使用Callable和Future创建线程 三种方式的对比 引言 在日常开发工作中,多线程开发可以说是必备技能 ...

随机推荐

  1. python之字符编码

    1.以什么编码存的就以什么编码取出; 内存固定使用unicode编码; 我们可以控制的编码是往硬盘存放或者基于网络传输选择编码. 2.数据是最先产生于内存中,是unicode格式,要想传输需要转成by ...

  2. CAS统一登录认证好文汇集贴

    悟空的专栏 https://blog.csdn.net/u010475041/article/category/7156505 LinBSoft的专栏 https://blog.csdn.net/ol ...

  3. Gradle Build速度加快方法汇总

    Android Studio用起来越来越顺手,但是却发现Build的速度实在不敢恭维,在google和度娘了几把(....)之后,大体就是分配更高的内存,步骤:Setting-->搜索gradl ...

  4. WCF 非http寄宿IIS

    摘要 从IIS 7 开始, IIS增加了对非HTTP协议的支持. 因此, 自IIS 7之后, 可以将NetTcpBinding等非HTTP协议的Bindings直接寄宿在IIS上面. 本文将介绍如何在 ...

  5. [转] React之Immutable学习记录

    从问题说起:熟悉 React 组件生命周期的话都知道:调用 setState 方法总是会触发 render 方法从而进行 vdom re-render 相关逻辑,哪怕实际上你没有更改到 Compone ...

  6. JSP中out.print()、out.println()以及out.write()的区别

    out是JSP九大内置对象之一,是JspWriter的一个对象,JspWriter继承了java.io.Writer类. out.print()和out.write() print()和println ...

  7. [转]如何将mysql表结构导出成Excel格式的(并带备注)

    方法一: 1.使用一个MySQL管理工具:SQLyog,点击菜单栏“数据库”下拉的最后一项: 导出的格式如下: 2.要想转成Excel格式的只需手动将该表复制到Excel中去. 方法二: 1.以下用的 ...

  8. [转]Spring Boot修改最大上传文件限制:The field file exceeds its maximum permitted size of 1048576 bytes.

    来源:http://blog.csdn.net/awmw74520/article/details/70230591 SpringBoot做文件上传时出现了The field file exceeds ...

  9. 聊聊Docker数据卷和数据卷容器

    当程序在容器运行的时候,特别是需要与其他容器中的程序或容器外部程序进行沟通交流,这时需要进行数据交换,作为常用的两种沟通数据的方式,网络通信与文件读写是需要提供给程序的支持, [数据卷] 文件是数据持 ...

  10. img没有src属性时自动出现边框

    当img没有接收到src属性的时候会自动出现边框,border:0/none都不管用的情况下 解决方法 一行css 可以解决 img[src=""],img:not([src]){ ...