细说多线程之Thread VS Runnable 01
线程创建的两种方式比较
继承Thread类
class MyThread extends Tread{ ...... @Override public void run(){ ...... } } MyThread mt = new MyThread();//创建线程 mt.start();//启动线程
实现Runnable接口
class MyThread implements Runnable{ ...... @Override public void run(){ ...... } } MyThread mt = new MyThread(); Thread td = new Thread(mt);//创建线程 mt.start();//启动线程
两种方式的比较
- 由于Java单继承特性,Runnable方式可以避免Thread方式中带来的缺陷。
- Runnable的代码可以被多个线程共享,适合用于多个线程处理同一资源的情况。
模拟火车站买票情况
- 剩余五张票
- 有三个窗口卖票
- 用Tread和Runnable两种方式来模拟
THread 代码实现
创建线程类
class MyThread extends Thread{ private int ticketsCount = 5;// 一共五张火车票 private String name;// 窗口 即线程名字 public MyThread(String name) { this.name = name; } @Override public void run() { while (ticketsCount > 0) { ticketsCount--;//如果还有票,就卖一张 System.out.println(name + "卖了一张票,剩余票数为" + ticketsCount); } } }
创建三个线程,模拟三个窗口卖票
//创建三个线程,模拟三个售票窗口 MyThread mt1 = new MyThread("窗口1"); MyThread mt2 = new MyThread("窗口2"); MyThread mt3 = new MyThread("窗口3");
启动三个线程,即窗口开始卖票
mt1.start(); mt2.start(); mt3.start();
执行结果
Runnable 实现代码
创建线程类
class MyThread implements Runnable{ private int ticketsCount = 5;// 一共五张火车票 @Override public void run() { while (ticketsCount > 0) { ticketsCount--;//如果还有票,就卖一张 System.out.println(Thread.currentThread().getName() + "卖了一张票,剩余票数为" + ticketsCount); } } }
创建三个线程
//创建三个线程,模拟三个售票窗口 MyThread mt = new MyThread(); Thread th1 = new Thread(mt, "窗口1"); Thread th2 = new Thread(mt, "窗口2"); Thread th3 = new Thread(mt, "窗口3");
启动线程
th1.start(); th2.start(); th3.start();
结果