2015-04-07 3 views
0

Я узнаю о концепциях 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. :(Пожалуйста, помогите мне, что здесь происходит.

+2

'flag' - локальная переменная. –

+0

Существует два экземпляра ThreadLearn, каждый из которых имеет метод run, содержащий локальную переменную 'flag'. Установка значения переменной 'flag' в одном месте (например, в Tortoise) не влияет на другую (Hare). – copeg

ответ

1

Каждый поток имеет собственный флаг, потому что вы создали 2 экземпляра ThreadLearn. являются независимыми. Если вам нужно поделиться «flag» => вам нужно переместить объявление «flag» из метода в тело класса и пометить его как статический и неустойчивый

+0

Фактически, флаги не независимо, потому что есть два экземпляра. Даже с одним экземпляром было бы два независимых флаги муравьев. Поле не обязательно должно быть статическим, если используется один экземпляр. –

Смежные вопросы