2

I would like some suggestions on how to stop the threads once the conditions are met.

Here are my codes:

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();
        }
    }

}

here is the output for 2 Animal objects I created s in the main method:

The threads kept on going even when the winner was declared (Homegrown Rabbit is the winner in this case). My question is how do I stop the other threads when the conditions are met? I tried the interrupted() method but I couldn't see any differences.

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!
Phuc Bui
  • 59
  • 1
  • 6

3 Answers3

3

You don't need any Thread primitives to stop the thread. You just need to exit the while loop.

Here is a modified run

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();
        }
    }

}
user93353
  • 13,733
  • 8
  • 60
  • 122
  • As stated above, once one of the two hits the 100th position, the loop stops from there and prints out the winner. I'm not quiet sure how to stop the loop of the one that is still running until it reaches the 100th position. – Phuc Bui Apr 06 '13 at 05:07
  • Ah thanks mate. I just noticed that the winner boolean wasn't used in my codes. I have understood it now :P. – Phuc Bui Apr 06 '13 at 05:12
  • I have made another update which changes the flow a bit to make it better - i.e. if checks position before sleeping rather than after sleeping. – user93353 Apr 06 '13 at 05:15
2

If winner is found, simply exit the loop.

   @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 );

    }

I executed this one and got this:

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!
Jops
  • 22,535
  • 13
  • 46
  • 63
0

Check the condition in every loop,when met,break out that loop,and the thread will be stopped.

interrupt() a thread is just to set the interrupt flag,nothing else changed,you can check that value by isInterrupted()

generally speaking,a thread is unable to stop unless itself wish to.

BlackJoker
  • 3,099
  • 2
  • 20
  • 27