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

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

    原文作者:好想学习呀
    原文地址: https://blog.csdn.net/weixin_46351306/article/details/113005440
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞