Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 - Fatal编程技术网

Java 同步方法赢得';不要在线程内工作

Java 同步方法赢得';不要在线程内工作,java,multithreading,Java,Multithreading,我正在试用一个带有线程的简单程序,它可以很好地与以下三类配合使用: public class Waiting { public static void main(String[] args) { Game game = new Game(); for (int i = 0; i <= 1; i++) { new Thread(new Player(game, i)).start(); } } } 但是

我正在试用一个带有线程的简单程序,它可以很好地与以下三类配合使用:

public class Waiting {
    public static void main(String[] args) {
        Game game = new Game();
        for (int i = 0; i <= 1; i++) {
            new Thread(new Player(game, i)).start();
        }
    }
}
但是,当我删除Game类并在Player类中编写方法“waiting”和“finished”时,“waiting”方法不知何故被忽略了

如何在Player类中运行这些方法?

wait()
释放锁,允许其他线程进入
synchronized
方法

此方法导致当前线程(此处称为T)将自身置于此对象的等待集中,然后放弃此对象上的任何和所有同步声明

public class Player implements Runnable { 
    private Game game;
    private int number;
    boolean plays = false;

    public Player(Game game, int number) {
        this.game = game;
        this.number = number + 1;
    }

    @Override
    public void run() {
        while (true) {
            System.out.println("starts number: " + number);
            considering(number);
            game.waiting(number);
            playing(number);
            game.finished(number);
        }
    }

    public void considering(int number) {
        try {
            System.out.println("player " + number + " considering");
            Thread.sleep((int) (Math.random() * 20000));
        } catch (Exception e) {
        }
    }

    public void playing(int number) {
        try {
            System.out.println("player " + number + " plays");
            Thread.sleep((int) (Math.random() * 20000));
        } catch (Exception e) {
        }
    }
}
public class Game {
    boolean plays = false;

    public Game() {

    }

    public synchronized void waiting(int number) {
        while (plays) {
            try {
                System.out.println("player " + number + " waiting");
                wait();
            } catch (Exception e) {
            }
        }
        plays = true;
    }

    public synchronized void finished(int number) {
        System.out.println("player " + number + " finished");
        plays = false;
        notify();
        System.out.println("----");
    }
}