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. Django目录结构分析

    Django目录结构分析: Django的Linux项目目录记录 [root@cmdb Django]# tree mysite mysite ├── cmdb │   ├── admin.py # ...

  2. 华为设备默认console密码

    admin@huawei.com Admin@huawei.com Admin@huawei huawei.com huawei@123 huawei Change_Me

  3. .Net分布式锁

    项目中一般使用lock作为锁,以便于多线程操作确保库内数据统一.但是如果分布式部署项目,则这种锁就是去了意义,这时可以使用redis或memcache的add方法作为分布式锁. 栗子

  4. bat循环打印输出1到10

    关键词:for cmd中查看帮助: for /? 循环一个数字序列: FOR /L %variable IN (start,step,end) DO command [command-paramete ...

  5. 一脸懵逼学习Linux的Shell编程

    1:什么是Shell??? (1)Shell是用户与内核进行交互操作的一种接口,目前最流行的Shell称为bash Shell(2)Shell也是一门编程语言<解释型的编程语言>,即she ...

  6. JDK1.8 JVM参数配置

    JAVA_OPTS=" -server #服务器模式 -Xmx4g #JVM最大允许分配的堆内存,按需分配 -Xms4g #JVM初始分配的堆内存,一般和Xmx配置成一样以避免每次gc后JV ...

  7. [转] webpack3最新版本配置研究(五) devtool,webpack-dev-server,CommonsChunkPlugin

    devtool devtool是webpack中config自带的属性只要使用就可以了不用安装 webpack官网的解释如下 当 webpack 打包源代码时,可能会很难追踪到错误和警告在源代码中的原 ...

  8. Zookeeper(一)CentOS7.5搭建Zookeeper3.4.12集群与命令行操作

    一. 分布式安装部署 1.0 下载地址 官网首页: https://zookeeper.apache.org/ 下载地址: http://mirror.bit.edu.cn/apache/zookee ...

  9. nginx的with-http_sub_module模块使用之替换字符串

    一.介绍 该ngx_http_sub_module模块是一个过滤器,通过将一个指定的字符串替换为另一个字符串来修改响应.该模块不是默认生成的,它应该使用--with-http_sub_module 配 ...

  10. MUI组件四:选择器、滚动条、单选框、区域滚动和轮播组件

    目录(?)[+]   1.picker(选择器) mui框架扩展了pipcker组件,可用于弹出选择器,在各平台上都有统一表现.poppicker和dtpicker是对picker的具体实现.*pop ...