通过一个多个窗口同时卖100张票来说明两种方式的差异
- 开发中优先选择实现Runnable接口的方式 因为“接口实现的方式没有类的继承局限性”
- 实现的方法更适合来处理多个线程共享数据(可以多个对象共享一个变量)
- Thread类本身也继承了Runnable接口
一:子类继承 Thread类
- 子类继承Thread类,并且重写Thread类中的run()方法,再通过子类的对象调用 start()方法
class Window extends Thread{
private static int tickets=100;
@Override
public void run() {
while(true){
if (tickets>0){
System.out.println(Thread.currentThread().getName()+":卖票,票号为:"+tickets);//此时的静态变量是不允许声明,但是可以使用
tickets--;
}else{
break;
}
}
}
}
public class WindowTest {
public static void main(String[] args) {
Windows window = new Windows();
Windows window1 = new Windows();
Windows window2 = new Windows();
window.setName("窗口一");
window1.setName("窗口二");
window2.setName("窗口三");
window.start();
window1.start();
window2.start();
}
}
二:通过实现 Runnable 接口
class Windows implements Runnable{
private int tickets=100;
@Override
public void run() {
while(true){
if (tickets>0){
System.out.println(Thread.currentThread().getName()+":卖票,票号为:"+tickets);
tickets--;
}else{
break;
}
}
}}
public class WindowTest {
public static void main(String[] args) {
Windows windows = new Windows();
Thread thread = new Thread(windows);
Thread thread1 = new Thread(windows);
Thread thread2 = new Thread(windows);
thread.setName("窗口一");
thread1.setName("窗口二");
thread2.setName("窗口三");
thread.start();
thread1.start();
thread2.start();
}
}
三:执行结果
两种方式的执行结果相同(两种方式都出现了线程安全问题:票号为100的相撞了 ):
窗口二:卖票,票号为:100
窗口三:卖票,票号为:100
窗口一:卖票,票号为:100
窗口一:卖票,票号为:97
窗口三:卖票,票号为:98
窗口二:卖票,票号为:99
窗口三:卖票,票号为:95
窗口一:卖票,票号为:96
窗口三:卖票,票号为:93
窗口二:卖票,票号为:94
窗口三:卖票,票号为:91
窗口一:卖票,票号为:92
窗口三:卖票,票号为:89
窗口二:卖票,票号为:90
窗口三:卖票,票号为:87
窗口一:卖票,票号为:88
窗口三:卖票,票号为:85
窗口二:卖票,票号为:86
窗口三:卖票,票号为:83
窗口一:卖票,票号为:84
窗口三:卖票,票号为:81
窗口二:卖票,票号为:82
窗口三:卖票,票号为:79
窗口一:卖票,票号为:80
窗口三:卖票,票号为:77
窗口二:卖票,票号为:78
窗口三:卖票,票号为:75
窗口一:卖票,票号为:76
窗口三:卖票,票号为:73
窗口二:卖票,票号为:74
窗口三:卖票,票号为:71
窗口一:卖票,票号为:72
窗口三:卖票,票号为:69
窗口二:卖票,票号为:70
窗口三:卖票,票号为:67
窗口一:卖票,票号为:68
窗口三:卖票,票号为:65
窗口二:卖票,票号为:66
窗口三:卖票,票号为:63
窗口一:卖票,票号为:64
窗口三:卖票,票号为:61
窗口二:卖票,票号为:62
窗口三:卖票,票号为:59
窗口一:卖票,票号为:60
窗口三:卖票,票号为:57
窗口二:卖票,票号为:58
窗口三:卖票,票号为:55
窗口三:卖票,票号为:53
窗口三:卖票,票号为:52
窗口一:卖票,票号为:56
窗口三:卖票,票号为:51
窗口三:卖票,票号为:49
窗口二:卖票,票号为:54
窗口三:卖票,票号为:48
窗口一:卖票,票号为:50
窗口三:卖票,票号为:46
窗口二:卖票,票号为:47
窗口三:卖票,票号为:44
窗口一:卖票,票号为:45
窗口三:卖票,票号为:42
窗口二:卖票,票号为:43
窗口三:卖票,票号为:40
窗口三:卖票,票号为:38
窗口一:卖票,票号为:41
窗口三:卖票,票号为:37
窗口二:卖票,票号为:39
窗口三:卖票,票号为:35
窗口三:卖票,票号为:33
窗口三:卖票,票号为:32
窗口三:卖票,票号为:31
窗口三:卖票,票号为:30
窗口三:卖票,票号为:29
窗口三:卖票,票号为:28
窗口一:卖票,票号为:36
窗口三:卖票,票号为:27
窗口三:卖票,票号为:25
窗口三:卖票,票号为:24
窗口二:卖票,票号为:34
窗口三:卖票,票号为:23
窗口一:卖票,票号为:26
窗口三:卖票,票号为:21
窗口二:卖票,票号为:22
窗口三:卖票,票号为:19
窗口一:卖票,票号为:20
窗口三:卖票,票号为:17
窗口二:卖票,票号为:18
窗口三:卖票,票号为:15
窗口一:卖票,票号为:16
窗口三:卖票,票号为:13
窗口二:卖票,票号为:14
窗口三:卖票,票号为:11
窗口一:卖票,票号为:12
窗口三:卖票,票号为:9
窗口二:卖票,票号为:10
窗口三:卖票,票号为:7
窗口一:卖票,票号为:8
窗口三:卖票,票号为:5
窗口二:卖票,票号为:6
窗口三:卖票,票号为:3
窗口一:卖票,票号为:4
窗口三:卖票,票号为:1
窗口二:卖票,票号为:2