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