java多线程卖票:继承方式与实现方式的对比

开三个窗口卖票,票一共一百张

继承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方法。

实现方式的好处

  • 避免了单继承的局限性
  • 多个线程可以共享同一个接口实现类的对象,非常适合多个相同线
    程来处理同一份资源。

线程不安全

发现票根有重复的,这就是线程不安全

java多线程卖票:继承方式与实现方式的对比_第1张图片

数据安全

原因

当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行。导致共享数据的错误。

解决方法

对多条操作共享数据的语句,只能让一个线程都执行完,在执行过程中,其他线程不可以参与执行。

你可能感兴趣的:(#,java)