Установка статической переменной в методе run () в java

#java #multithreading #thread-safety #concurrent-programming

#java #многопоточность #безопасность потоков #параллельное программирование

Вопрос:

У меня есть статическая переменная, которую я хотел бы установить в методе run(). У меня есть следующее:

 public class Test{
   public static int temp;
   public static void main(String [] args)
     {
         update();
         System.out.println("This is the content of temp" temp);
     }
   public static void update()
    {
        (new Thread() {
        @Override
        public void run() {
          // do some stuff
                   Test.temp=15;
       }}).start();
    }
 

Я бы хотел, чтобы содержимое temp было обновлено до 15; но когда я печатаю его в основной функции, он показывает 0. Как это можно исправить?

Ответ №1:

Потоки работают одновременно, поэтому вам следует дождаться завершения вашего нового потока:

 public class Test{
   public static int temp;
   public static void main(String [] args) {
      update().join(); //we wait until new thread finishes
      System.out.println("This is the content of temp" temp);
   }

   public static Thread update() {
       Thread t = new Thread() {
          @Override
          public void run() {
             // do some stuff
             Test.temp=15;
          }
       };
       t.start();
       return t;
    }
 

Ответ №2:

Вы должны понимать, как работает поток.

Я покажу вам здесь два фрагмента кода, чтобы сначала понять, что переменным, которые инициализируются внутри потока, требуется время для обновления, пока поток не будет завершен.

 public class Num {

    public static int temp;
       public static void main(String [] args) throws InterruptedException
         {
            update();

             System.out.println("This is the content of temp" Num.temp);//This will print before temp=15 is updated
         }
       public static void update()
        {
            (new Thread() {
            @Override
            public void run() {
              // do some stuff
                       Num.temp=15;   
                       System.out.println("Value of temp:" Num.temp);//This statement prints after
           }}).start();
        }
}
 

Он выводит следующее:

 This is the content of temp0
Value of temp:15
 

Второй показывает, что если вы подождете небольшое количество времени (Thread.sleep(10)) после выполнения потока, значение будет обновлено:

 public class Num {

    public static int temp;
       public static void main(String [] args) throws InterruptedException
         {
            update();
            Thread.sleep(10);
             System.out.println("This is the content of temp" Num.temp);//This will print correct value now
         }
       public static void update()
        {
            (new Thread() {
            @Override
            public void run() {
              // do some stuff
                       Num.temp=15;                      
           }}).start();
        }
}
 

Но здесь я бы предложил тот же метод, что и Филипп. Просто добавьте throws InterruptedException в основную функцию