#java #multithreading #java-threads
#java #многопоточность #java-потоки
Вопрос:
При печати я получаю пустую hashmap, каков наилучший подход для совместного использования статической изменчивой переменной между потоками?
class RunnableDemo implements Runnable {
int i;
RunnableDemo(int i) {
i = i;
}
public void run(){
finResult.put("value" str(i), 1);
}
public void start () {
System.out.println("Starting " );
if (t == null) {
t = new Thread (this);
t.start ();
}
}
public class TestThread {
public static volatile ConcurrentHashMap<String, Integer> finResult = new ConcurrentHashMap<String, Integer>();
public static void main(String args[]) {
ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newCachedThreadPool();
for(int i=0; i < 4; i ){
RunnableDemo task = new RunnableDemo(i);
executor.execute(task);
}
executor.shutdown();
}
System.out.println(TestThread.finResult);
}
System.out.println(TestThread.finResult);
Это должно вывести finResult со всеми значениями из потоков.
Комментарии:
1. Ответ «вы, вероятно, не должны». Каково предполагаемое использование? Похоже
CyclicBarrier
, что это может быть.2. Я просто хочу обновляться
finResult
из всех потоков. Вместо того, чтобы возвращать какое-либо значение, я помещаю значения в глобальную общую переменную.3.
parallelStream()
?4. У меня есть два варианта: 1) Возвращать значение из потоков (которое я не знаю, как это сделать) и 2) Иметь
global variable
, которое модифицируется потоками с использованиемsync
block. Я сосредоточен на втором варианте.5. Не могли бы вы опубликовать полный компилируемый код? Для чего нужен метод «start ()»? Кроме того, i=i не имеет смысла в конструкторе и для чего нужен str(i) ?