在实际应用中,我们经常用到多线程,如车站的售票系统,车站的各个售票口相当于各个线程, 以下是创建多个现场的两种方式:
一.通过继承Thread
类,重写Thread
的run()
方法,将线程运行的逻辑放在其中.
- 实现
MyThread2
类 继承Thread
类class MyThread2 extends Thread{ private int ticket=5; private String name; public MyThread2(String name){ this.name = name; } public void run(){ for(int i=0; i<500; i++){ if (this.ticket>0){ System.out.println(this.name+"卖票---->"+(this.ticket--)); } } } }
- 创建三个
MyThread2
线程, 并运行 (三个线程, 分别执行卖出5张票的任务或资源), 最后结果:最终共计卖出15张票
@Test public void testD() { MyThread2 mt1 = new MyThread2("一号窗口"); MyThread2 mt2 = new MyThread2("二号窗口"); MyThread2 mt3 = new MyThread2("三号窗口"); mt1.start(); mt2.start(); mt3.start(); }
- 运行结果为:
一号窗口卖票---->5 一号窗口卖票---->4 一号窗口卖票---->3 一号窗口卖票---->2 一号窗口卖票---->1 二号窗口卖票---->5 二号窗口卖票---->4 二号窗口卖票---->3 二号窗口卖票---->2 二号窗口卖票---->1 三号窗口卖票---->5 三号窗口卖票---->4 三号窗口卖票---->3 三号窗口卖票---->2
- 创建三个
-
任务分配如图所示:
image.png
二.通过实现Runnable接口,实例化Thread类.
-
MyThread3
类实现Runnable
接口
class MyThread3 implements Runnable{
private int ticket=5;
private String name;
@Override
public void run() {
for (int i=0; i<500; i++) {
if (this.ticket>0){
System.out.println(Thread.currentThread().getName()+"卖票---->"+(this.ticket--));
}
}
}
}
- 一个卖出5张票的任务
MyThread3
, 创建三个线程Thread
共同执行该任务(也就是共享MyThread3
这一个资源), 最终结果: 卖出总计卖出5张票.@Test public void testE() { MyThread3 mt = new MyThread3(); Thread thread1 = new Thread(mt,"一号窗口"); Thread thread2 = new Thread(mt,"二号窗口"); Thread thread3 = new Thread(mt,"三号窗口"); thread1.start(); thread2.start(); thread3.start(); } }
- 运行结果:
一号窗口卖票---->5 一号窗口卖票---->4 一号窗口卖票---->3 一号窗口卖票---->2 一号窗口卖票---->1
-
任务分配如图所示:
image.png
三. 总结:
实现Runnable接口比继承Thread类来实现多线程有如下明显优点:
- 适合多个相同程序代码使用共同资源;
- 避免由单继承局限带来的影响;
- 所以在实际开发过程中一般都是使用实现Runnable接口来实现多线程的.
网友评论