Установка статической переменной в методе run () в 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. Как это можно зафиксировать?

java,multithreading,thread-safety,concurrent-programming,

-3

Ответов: 2


3 принят

Нитки работают одновременно, поэтому вам нужно подождать, пока ваш новый поток не закончится:

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

1

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

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

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основную функцию

Java, многопоточность, безопасность потоки, параллельное программирование,
Похожие вопросы