【问题标题】:Stop current thread until the called thread is finished then continue it停止当前线程,直到被调用线程完成,然后继续它
【发布时间】:2020-07-17 21:06:06
【问题描述】:

假设我有这两种方法并且它们一直互相调用:

public void run() {
        try {
            Thread.sleep(1000);
            System.out.println("Thread " +
                    Thread.currentThread().getId() +
                    " is running");
            posses(numberOfPlayers, players);
        } catch (Exception e) {
            System.out.println("Exception Caught");
        }
    }

synchronized public void posses(int n, Players[] players) throws InterruptedException {
        Random rand = new Random();
        Scanner input = new Scanner(System.in);

        for (int i = 0; i < players.length; i++) {
            if (players[i].haveBall)
                System.out.println("Player" + i + ", ");
        }
        System.out.println(" \bhave the ball now");

        for (int i = 1; i < numberOfPlayers; i++) {
            if (players[i].haveBall) {
                System.out.println("\nList of available players to pass for player " + i + ": ");
                for (int j = 1; j < numberOfPlayers; j++) {
                    if (players[j].isActive && j != i) {
                        System.out.println("Player " + players[j].number);
                    }
                }

                System.out.println();

                do {
                    receiver = rand.nextInt(numberOfPlayers - 1) + 1;
                } while (i == receiver && players[receiver].isActive);

                if (players[receiver].haveBall) {
                    System.out.println("Player" + i + " passes");
                    System.out.println("Player" + receiver + " receives");

                    players[receiver].start();
                    players[i].join(2000);

                    players[i].haveBall = false;
                    players[receiver].haveBall = true;
                    players[receiver].players = players[0].players;
                    ;

                    System.out.println();

                    for (int p = 1; p < n; p++) {
                        System.out.println(players[p].haveBall);
                    }

                } else {
                    players[i].haveBall = false;
                    System.out.println("Player" + i + " passes");
                    players[receiver].haveBall = true;
                    System.out.println(players[receiver].number + " receives");
                    players[receiver].players = players[0].players;

                    System.out.println();

                    for (int p = 1; p < n; p++) {
                        System.out.println(players[p].haveBall);
                    }

                    players[receiver].start();
                }
            }
        }

这是一个足球队,我们有两个球,每个球员最多可以有一个球。这些球员在不能将球传给当前有球的球员的情况下随机传球。 我在这里有一个 for 循环,它循环播放球员并选择有球的球员并让他们传球。 我想做的是,如果我们要传球的球员有球,等到他传球,然后把球传给他。但是我编写的线程的 join() 方法不能以这种方式工作。(考虑每个玩家都是一个线程)。什么是最好的解决方案?

【问题讨论】:

    标签: java multithreading locking deadlock


    【解决方案1】:

    我会创建一个所有工作线程都可以访问的共享资源,一旦一个线程选择了一个资源,他就使用该资源进行工作,一旦完成,他就会将该资源返回到共享资源池。

    例如一个球队列,玩家查询队列以检查是否有可用的球,在捡起球后,他们对球进行处理,然后将其放回队列中。这保证了每个球员一次 1 个球的基本要求。

    需要考虑的更多事项:

    • 线程饥饿,一名球员不触球。解决此问题的一种方法是在球员捡起球后让线程休眠。
    • 此示例是共享资源的轮询方法,易于实现,但在线程检查资源是否可用的“浪费”循环中,在您有 1 个球到 100 万个球员的情况下,类似的情况可能非常浪费推动减少浪费的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多