三、多线程之Thread与Runnable的区别

Thread与Runnable的区别(用三个窗口同时出售10张车票为例子)

运行代码
运行结果 分析
System.out.println("开始测试多线程");
class MyThread extends Thread {
private int ticket=10;
private String name;
public MyThread(String name){
this.name=name;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
if (this.ticket > 0) {
System.out.println(name
+ "正在出售倒数第" + this.ticket-- + "张票!");
}
}
}
}
Thread thread1 = new MyThread("一号窗");
Thread thread2 = new MyThread("二号窗");
Thread thread3 = new MyThread("三号窗");
thread1.start();
thread2.start();
thread3.start();
System.out.println("结束测试多线程");
开始测试多线程
结束测试多线程
一号窗正在出售倒数第10张票!
三号窗正在出售倒数第10张票!
三号窗正在出售倒数第9张票!
三号窗正在出售倒数第8张票!
三号窗正在出售倒数第7张票!
三号窗正在出售倒数第6张票!
三号窗正在出售倒数第5张票!
三号窗正在出售倒数第4张票!
三号窗正在出售倒数第3张票!
三号窗正在出售倒数第2张票!
三号窗正在出售倒数第1张票!
二号窗正在出售倒数第10张票!
一号窗正在出售倒数第9张票!
一号窗正在出售倒数第8张票!
一号窗正在出售倒数第7张票!
一号窗正在出售倒数第6张票!
一号窗正在出售倒数第5张票!
一号窗正在出售倒数第4张票!
一号窗正在出售倒数第3张票!
一号窗正在出售倒数第2张票!
一号窗正在出售倒数第1张票!
二号窗正在出售倒数第9张票!
二号窗正在出售倒数第8张票!
二号窗正在出售倒数第7张票!
二号窗正在出售倒数第6张票!
二号窗正在出售倒数第5张票!
二号窗正在出售倒数第4张票!
二号窗正在出售倒数第3张票!
二号窗正在出售倒数第2张票!
二号窗正在出售倒数第1张票!

出现票超,会出现各窗口自行处理10张。

各个线程完全独立

System.out.println("开始测试多线程");
class MyRunnable implements Runnable {
private int ticket=10;
private String name;
public MyRunnable(String name){
this.name=name;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
if (this.ticket > 0) {
System.out.println(name
+ "正在出售倒数第" + this.ticket-- + "张票!");
}
}
}
}
Thread thread1 = new Thread(new MyRunnable("一号窗"));
Thread thread2 = new Thread(new MyRunnable("二号窗"));
Thread thread3 = new Thread(new MyRunnable("三号窗"));
thread1.start();
thread2.start();
thread3.start();
System.out.println("结束测试多线程");

开始测试多线程
结束测试多线程
一号窗正在出售倒数第10张票!
二号窗正在出售倒数第10张票!
二号窗正在出售倒数第9张票!
二号窗正在出售倒数第8张票!
二号窗正在出售倒数第7张票!
二号窗正在出售倒数第6张票!
一号窗正在出售倒数第9张票!
二号窗正在出售倒数第5张票!
三号窗正在出售倒数第10张票!
三号窗正在出售倒数第9张票!
三号窗正在出售倒数第8张票!
三号窗正在出售倒数第7张票!
三号窗正在出售倒数第6张票!
三号窗正在出售倒数第5张票!
三号窗正在出售倒数第4张票!
三号窗正在出售倒数第3张票!
三号窗正在出售倒数第2张票!
三号窗正在出售倒数第1张票!
二号窗正在出售倒数第4张票!
二号窗正在出售倒数第3张票!
二号窗正在出售倒数第2张票!
二号窗正在出售倒数第1张票!
一号窗正在出售倒数第8张票!
一号窗正在出售倒数第7张票!
一号窗正在出售倒数第6张票!
一号窗正在出售倒数第5张票!
一号窗正在出售倒数第4张票!
一号窗正在出售倒数第3张票!
一号窗正在出售倒数第2张票!
一号窗正在出售倒数第1张票!

出现票超,会出现各窗口自行处理10张。

各个线程完全独立

System.out.println("开始测试多线程");
class MyRunnable implements Runnable {
private int ticket = 10;
@Override
public void run() {
for (int i = 0; i < 10; i++) {
if (this.ticket > 0) {
System.out.println(Thread.currentThread().getName()
+ "正在出售倒数第" + this.ticket-- + "张票!");
}
}
}
}
MyRunnable runnable=new MyRunnable();
Thread thread1 = new Thread(runnable,"一号窗");
Thread thread2 = new Thread(runnable,"二号窗");
Thread thread3 = new Thread(runnable,"三号窗");
thread1.start();
thread2.start();
thread3.start();
System.out.println("结束测试多线程");

开始测试多线程
结束测试多线程
一号窗正在出售倒数第10张票!
一号窗正在出售倒数第7张票!
一号窗正在出售倒数第6张票!
一号窗正在出售倒数第5张票!
一号窗正在出售倒数第4张票!
一号窗正在出售倒数第3张票!
一号窗正在出售倒数第2张票!
一号窗正在出售倒数第1张票!
三号窗正在出售倒数第8张票!
二号窗正在出售倒数第9张票!

票数正常,各窗口以剩下的票数出售。

线程共同使用类,但运行多次会发现

有些窗口出售同样的票,意味并发时

会出现同票出售。

 

总结:

采用继承Thread类方式:
 (1)优点:编写简单,如果需要访问当前线程,无需使用Thread.currentThread()方法,直接使用this,即可获得当前线程。
 (2)缺点:因为线程类已经继承了Thread类,所以不能再继承其他的父类。
采用实现Runnable接口方式:
 (1)优点:线程类只是实现了Runable接口,还可以继承其他的类。在这种方式下,可以多个线程共享同一个目标对象,所以非常适合多个相同线程来处理同一份资                源的情况。
 (2)缺点:编程稍微复杂,如果需要访问当前线程,必须使用Thread.currentThread()方法。

 

posted @ 2021-05-11 14:03  syingBlog  阅读(355)  评论(0编辑  收藏  举报