Я узнаю о концепциях MultiThreading. Я просто работал над простым POC и обнаружил немного странное поведение. Пожалуйста, помогите мнеThread повторно запускает метод run()
Цель: - запустить 2 потока, один из них - «Черепаха», а другой - «Заяц». Заставить зайца спать в течение 2 секунд и разрешить только черепаху завершить нить до Харе.
Мой Runnable Класс
package com.learn;
public class ThreadLearn implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
//Thread.currentThread().interrupt();
boolean flag = false;
System.out.println("Running : " +Thread.currentThread().getName());
if(Thread.currentThread().getName().equalsIgnoreCase("Hare")){
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("Flag before Setting : " +flag);
if(!flag){
System.out.println("Winner : " +Thread.currentThread().getName());
flag = true;
System.out.println("Flag after Setting : " +flag);
}
}
}
и мой основной класс метод
package com.learn;
public class ThreadExecutor {
public static void main(String args[]){
ThreadLearn l1 = new ThreadLearn();
ThreadLearn l2 = new ThreadLearn();
Thread t1 = new Thread(l1,"Tortoise");
Thread t2 = new Thread(l2,"Hare");
System.out.println("Thread STATE : " +Thread.currentThread().getState());
t1.start();
t2.start();
System.out.println("END STATE : " +t1.getState());
}
}
Это выход я получил
Thread STATE : RUNNABLE
END STATE : RUNNABLE
Running : Tortoise
Running : Hare
Flag before Setting : false
Winner : Tortoise
Flag after Setting : true
Flag before Setting : false
Winner : Hare
Flag after Setting : true
Если вы видите выход, у меня есть установите «флаг» как false в run(), после заставляя зайца therad спать в течение 2 секунд, поток Tortoise запускается и устанавливает значение флага как «true», поэтому, когда заяц приходит через 2 секунды, мое ожидание было флагом, будет истинным, а Winner sysout вообще не будет напечатано. но флаг снова устанавливается как «ложь» и запускает Winner sysout для Hare. :(Пожалуйста, помогите мне, что здесь происходит.
'flag' - локальная переменная. –
Существует два экземпляра ThreadLearn, каждый из которых имеет метод run, содержащий локальную переменную 'flag'. Установка значения переменной 'flag' в одном месте (например, в Tortoise) не влияет на другую (Hare). – copeg