【问题标题】:How to stop running threads when the conditions are met?满足条件时如何停止正在运行的线程?
【发布时间】:2013-04-06 04:46:38
【问题描述】:

我想要一些关于如何在满足条件后停止线程的建议。

这是我的代码:

public class Animal implements Runnable {
    private static boolean winner = false;
    private String name;
    private int position;
    private int speed;
    private long restMax;



    public Animal(String name, int position, int speed, long restMax) {

        this.name = name;
        this.position = position;
        this.speed = speed;
        this.restMax = restMax;
    }



    @Override
    public void run() {

        while (position < 100){
            position += speed;
            try {
                Thread.sleep((long) (0 + (Math.random()  * restMax)));
            } catch (InterruptedException e) {

                e.printStackTrace();
            }


        System.out.println(name + " is at position " + position );

    }
        if (position >= 100){
            winner = true;
            System.out.println(name + " is the winner of the race!");
            Thread.interrupted();
        }
    }

}

这是我在 main 方法中创建的 2 个 Animal 对象的输出:

即使在宣布获胜者时线程仍在继续(在这种情况下,本土兔子是获胜者)。我的问题是如何在满足条件时停止其他线程?我尝试了 interrupted() 方法,但看不到任何差异。

Homegrown Rabbit is at position 5

Homegrown Rabbit is at position 10

Wild Turtle is at position 3

Wild Turtle is at position 6

Homegrown Rabbit is at position 15

Homegrown Rabbit is at position 20

Wild Turtle is at position 9

Wild Turtle is at position 12

Wild Turtle is at position 15

Homegrown Rabbit is at position 25

Wild Turtle is at position 18

Homegrown Rabbit is at position 30

Wild Turtle is at position 21

Homegrown Rabbit is at position 35

Wild Turtle is at position 24

Homegrown Rabbit is at position 40

Wild Turtle is at position 27

Wild Turtle is at position 30

Homegrown Rabbit is at position 45

Homegrown Rabbit is at position 50

Wild Turtle is at position 33

Homegrown Rabbit is at position 55

Wild Turtle is at position 36

Wild Turtle is at position 39

Homegrown Rabbit is at position 60

Wild Turtle is at position 42

Wild Turtle is at position 45

Homegrown Rabbit is at position 65

Wild Turtle is at position 48

Wild Turtle is at position 51

Homegrown Rabbit is at position 70

Homegrown Rabbit is at position 75

Wild Turtle is at position 54

Wild Turtle is at position 57

Wild Turtle is at position 60

Homegrown Rabbit is at position 80

Homegrown Rabbit is at position 85

Wild Turtle is at position 63

Wild Turtle is at position 66

Homegrown Rabbit is at position 90

Wild Turtle is at position 69

Wild Turtle is at position 72

Wild Turtle is at position 75

Homegrown Rabbit is at position 95

Wild Turtle is at position 78

Homegrown Rabbit is at position 100

Homegrown Rabbit is the winner of the race!

Wild Turtle is at position 81

Wild Turtle is at position 84

Wild Turtle is at position 87

Wild Turtle is at position 90

Wild Turtle is at position 93

Wild Turtle is at position 96

Wild Turtle is at position 99

Wild Turtle is at position 102

Wild Turtle is the winner of the race!

【问题讨论】:

标签: java multithreading


【解决方案1】:

您不需要任何线程原语来停止线程。你只需要退出while循环。

这是修改后的运行

public void run() 
{
    while (winner == false)
    {
        position += speed;
        System.out.println(name + " is at position " + position );

        if(position >= 100)
        {
            winner = true;
            System.out.println(name + " is the winner of the race!");
            break;
        }

        try 
        {
            Thread.sleep((long) (0 + (Math.random()  * restMax)));
        } 
        catch (InterruptedException e) 
        {
            e.printStackTrace();
        }
    }

}

【讨论】:

  • 如上所述,一旦两个中的一个达到第 100 位,循环从那里停止并打印出获胜者。我不确定如何停止仍在运行的循环,直到它到达第 100 个位置。
  • 啊,谢谢伙计。我只是注意到我的代码中没有使用获胜者布尔值。我现在明白了:P。
  • 我做了另一个更新,稍微改变了流程以使其更好 - 即如果在睡觉前而不是在睡觉后检查位置。
【解决方案2】:

如果找到获胜者,只需退出循环。

   @Override
    public void run() {


        while (position < 100){
            position += speed;
            try {
                Thread.sleep((long) (0 + (Math.random()  * restMax)));
            } catch (InterruptedException e) {

                e.printStackTrace();
            }

           /* Since winner is static, once one thread sets this to true,
              other threads will stop their execution as well. */
           if (winner)
               break;
        System.out.println(name + " is at position " + position );

    }

我执行了这个并得到了这个:

rabbit is at position 2
horse is at position 5
rabbit is at position 4
horse is at position 10
horse is at position 15
horse is at position 20
horse is at position 25
horse is at position 30
rabbit is at position 6
horse is at position 35
rabbit is at position 8
horse is at position 40
horse is at position 45
horse is at position 50
horse is at position 55
horse is at position 60
horse is at position 65
horse is at position 70
horse is at position 75
horse is at position 80
horse is at position 85
horse is at position 90
horse is at position 95
horse is at position 100
horse is the winner of the race!

【讨论】:

    【解决方案3】:

    检查每个循环中的条件,当满足时,打破该循环,线程将被停止。

    interrupt()一个线程只是设置中断标志,没有其他改变,你可以通过isInterrupted()查看该值

    一般来说,线程无法停止,除非它自己愿意。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      相关资源
      最近更新 更多