Java面试 关于两种线程创建方式的比较

这篇博客通过实例展示了Java中两种创建线程的方式——继承Thread类和实现Runnable接口,并分析了它们在处理线程安全问题上的不足。在售票场景中,两种方式都出现了线程不安全的问题,即票号重复销售。这说明在并发环境下,需要额外的同步机制来确保数据一致性。
摘要由CSDN通过智能技术生成

通过一个多个窗口同时卖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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值