Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程输出播放器_Java_Multithreading_Static - Fatal编程技术网

Java 线程输出播放器

Java 线程输出播放器,java,multithreading,static,Java,Multithreading,Static,有人能告诉我这个代码的输出是什么,为什么?我试着自己做,但没用 public static class Player extends Thread { int id; Player op; public Player(int n){ id = n; } public void connect(Player other) { op = other; } public void run() {

有人能告诉我这个代码的输出是什么,为什么?我试着自己做,但没用

public static class Player extends Thread {
    int id;
    Player op;

    public Player(int n){
        id = n;
    }

    public void connect(Player other) {
        op = other;
    }

    public void run() {
        if(op != null) {
            try {
                op.join();
            } catch (InterruptedException ex) {
                System.out.println(" INTERRUPTED");
            }
        }
        System.out.println("PLAYER ID ="+id);
    }

    public static void main(String[] args) {
        Player p1=new Player(1);
        Player p2=new Player(2);
        p1.connect(p2);
        p1.start();
        p2.start();
    }
}

首先,您不能对一个类使用静态修饰符,除非它嵌套在另一个类中,所以您所拥有的不会编译。一旦通过删除static关键字修复了该问题,程序将运行并打印:

PLAYER ID =2
PLAYER ID =1
主线程初始化p1和p2线程,启动它们,然后退出。这些线程是非守护进程线程,因此JVM将一直运行,直到它们完成为止

p1线程调用p2线程上的join,导致p1进入休眠状态,直到p2完成。p2将其op字段设置为null,因此执行、打印输出并完成(终止时通知p1)。此时p1从等待p2中唤醒,打印输出并终止

因此,只要只有一个线程在另一个线程上调用connect,连接线程就会在打印输出之前等待另一个线程完成。如果您添加一行
p2.connect(p1)在启动线程之前,您应该会遇到死锁,因为两个线程一直在等待对方


p1不能保证在p2之前启动。如果p2碰巧首先执行了它的run方法,那么p1将连接到一个死线程,这样它就不必等待;无论哪个线程先开始,结果都是相同的(p2先结束)。

什么不起作用?为什么不自己运行它来查看输出?