多线程之基础篇04:两种方式实现的比较
2018-03-17 09:05
309 查看
多线程之基础篇04:两种方式实现的比较
标签: 多线程多线程之基础篇04两种方式实现的比较
问题
继承Thread类
实现Runnable方法
为什么会出现不同
问题
我们通过经典的例子来比较两种方法:H市火车站有三个窗口同时卖票,用三个线程来模拟并实现
继承Thread类
package charThread; class Window1 extends Thread { int ticketsCount = 5; //一共有5张火车票 public void run() { while (ticketsCount > 0) { ticketsCount --; //如果还有票就卖出一张 System.out.println(Thread.currentThread().getName() + "窗口已经售出一张,剩余票数" + ticketsCount); } } } public class TicketsThread1 { public static void main(String[] args) { Window1 w1 = new Window1(); Window1 w2 = new Window1(); Window1 w3 = new Window1(); w1.setName("窗口1"); w2.setName("窗口2"); w3.setName("窗口3"); w1.start(); w2.start(); w3.start(); } }
输出结果:
窗口2窗口已经售出一张,剩余票数4 窗口1窗口已经售出一张,剩余票数4 窗口3窗口已经售出一张,剩余票数4 窗口3窗口已经售出一张,剩余票数3 窗口3窗口已经售出一张,剩余票数2 窗口1窗口已经售出一张,剩余票数3 窗口1窗口已经售出一张,剩余票数2 窗口2窗口已经售出一张,剩余票数3 窗口1窗口已经售出一张,剩余票数1 窗口3窗口已经售出一张,剩余票数1 窗口1窗口已经售出一张,剩余票数0 窗口2窗口已经售出一张,剩余票数2 窗口3窗口已经售出一张,剩余票数0 窗口2窗口已经售出一张,剩余票数1 窗口2窗口已经售出一张,剩余票数0
我们看到,车站一共只有五张票,但是每个窗口都卖了五张票,很显然这是不对的!
实现Runnable方法
package charThread; /** * Created by japson on 9/7/2017. */ class Window2 implements Runnable { int ticketsCount = 5; public void run() { while (ticketsCount > 0) { ticketsCount --; //如果还有票就卖出一张 System.out.println(Thread.currentThread().getName() + "窗口已经售出一张,剩余票数" + ticketsCount); } } } public class TicketsThread2 { public static void main(String[] args) { Window2 w = new Window2(); //一个Thread实例,被多个线程共享 Thread t1 = new Thread(w); Thread t2 = new Thread(w); Thread t3 = new Thread(w); t1.setName("窗口1"); t2.setName("窗口2"); t3.setName("窗口3"); t1.start(); t2.start(); t3.start(); } }
输出结果:
窗口1窗口已经售出一张,剩余票数4 窗口1窗口已经售出一张,剩余票数2 窗口1窗口已经售出一张,剩余票数0 窗口3窗口已经售出一张,剩余票数3 窗口2窗口已经售出一张,剩余票数1
这证明了Runnable的代码可以被多个线程(Thread实例)共享,适合于多个线程处理统一资源的情况。
为什么会出现不同
为什么通过继承Thread类和实现Runnable接口不一样呢?主要是因为:
前者创建三个子类的对象,每个线程有自己的对象,每个线程都有自己的ticketsCount,因此三个线程各自卖了各自的5张票;
后者三个线程共用一个子类的对象,因此三个线程共享了ticketsCount;
相关文章推荐
- Java多线程基础--02之 常用的实现多线程的两种方式
- 多线程基础-实现多线程的两种方式(二)
- Java多线程系列--【基础篇02】- 常用的实现多线程的两种方式
- Java【多线程知识总结(5)】比较继承Thread类创建线程和实现Runnable接口创建线程这两种方式
- Java两种实现多线程方式的比较( implements Runnable 与 extends Thread )
- Java【多线程知识总结(5)】比较继承Thread类创建线程和实现Runnable接口创建线程这两种方式
- Java_基础—多线程(匿名内部类实现线程的两种方式和设置名字的方法)
- Java实现多线程的两种方式比较及区别
- Java多线程的实现方式比较(两种方式比较)
- 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口
- 多线程一:两种方式实现多线程
- 多线程中的线程间通信及等待/通知机制的两种实现方式
- Java中实现多线程的两种方式
- Java多线程系列--“基础篇”02之 常用的实现多线程的两种方式
- 《Spark商业案例与性能调优实战100课》第9课:商业案例之通过Spark SQL 下两种不同方式实现口碑最佳和最热门电影比较
- AsyncTask和Handler两种异步方式的实现和区别比较
- 多线程间的数据共享的几种实现方式比较
- Java多线程系列--“基础篇”02之 常用的实现多线程的两种方式
- Java中有两种实现多线程的方式以及两种方式之间的区别
- TreeSet集合排序两种实现方式Comparable和Comparator比较