开三个窗口卖票,票一共一百张
继承thread接口
class Window extends Thread{
private static int ticket = 100;
@Override
public void run() {
while (true){
if (ticket > 0){
System.out.println("卖票, 票根为:" + ticket);
ticket--;
}else{
break;
}
}
}
}
public class Solution {
// 创建Thread子类对象,即创建了线程对象。
public static void main(String[] args) {
Window w1 = new Window();
Window w2 = new Window();
Window w3 = new Window();
w1.start();
w2.start();
w3.start();
}
}
实现Runable接口
class Window implements Runnable{
private int ticket = 100;
@Override
public void run() {
while (true){
if (ticket > 0){
System.out.println("卖票, 票根为:" + ticket);
ticket--;
}else{
break;
}
}
}
}
public class Solution {
// 创建Thread子类对象,即创建了线程对象。
public static void main(String[] args) {
Window w1 = new Window();
Thread t1 = new Thread(w1);
Thread t2 = new Thread(w1);
Thread t3 = new Thread(w1);
t1.start();
t2.start();
t3.start();
}
}
对比
区别
- 继承Thread:线程代码存放Thread子类run方法中。
- 实现Runnable:线程代码存在接口的子类的run方法。
实现方式的好处
- 避免了单继承的局限性
- 多个线程可以共享同一个接口实现类的对象,非常适合多个相同线
程来处理同一份资源。
线程不安全
发现票根有重复的,这就是线程不安全
数据安全
原因
当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行。导致共享数据的错误。
解决方法
对多条操作共享数据的语句,只能让一个线程都执行完,在执行过程中,其他线程不可以参与执行。