您的位置:首页 > 其它

多线程之基础篇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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  多线程 线程
相关文章推荐