Java中的多线程与同步
我正在开发一个多线程程序,其中每个线程计算两个数字的GCD,将数字和GCD存储到Java中的多线程与同步,java,multithreading,Java,Multithreading,我正在开发一个多线程程序,其中每个线程计算两个数字的GCD,将数字和GCD存储到TreeMap,并在所有线程完成后打印出TreeMap。我应该使用什么样的方法来确保只有一个线程同时存储数据,以及在准备打印时如何使用最后一个线程打印TreeMap for (int i = 0; i < myList.size(); ++i) { for (int j = i + 1; j < myList.size(); ++j) { modulus1 = myList.get
TreeMap
,并在所有线程完成后打印出TreeMap
。我应该使用什么样的方法来确保只有一个线程同时存储数据,以及在准备打印时如何使用最后一个线程打印TreeMap
for (int i = 0; i < myList.size(); ++i) {
for (int j = i + 1; j < myList.size(); ++j) {
modulus1 = myList.get(i);
modulus2 = myList.get(j);
pool.execute(new ThreadProcessRunnable(modulus1, modulus2, myMap));
}
}
public void run() {
ThreadProcess process = null;
try {
// Only one thread should execute the following code
for (Map.Entry<BigInteger, ArrayList<BigInteger>> entry : myMap.entrySet()) {
System.out.println("key ->" + entry.getKey() + ", value->" + entry.getValue());
}
} catch (Exception e) {
System.err.println("Exception ERROR");
}
for(int i=0;i”+entry.getKey()+”,value->“+entry.getValue());
}
}捕获(例外e){
System.err.println(“异常错误”);
}
//只有一个线程应该执行以下代码
同步{
对于(Map.Entry:myMap.entrySet()){
System.out.println(“key->”+entry.getKey()+”,value->“+entry.getValue());
}
}
在需要保证单线程访问映射的地方,必须使用syncronize(myMap){…}
块
至于按最后一个线程打印结果,您可以使用布尔标志作为完整性的信号,并每次检查它。不要忘记将其设置为volatile,让每个线程看到其值的变化
UPD:Brian Goetz“Java并发实践”是一本强烈建议阅读的书。您可以使用它来确保线程安全。并且使用它来确保只有在所有线程都死机时才进行打印
编辑:在主线程中进行打印。在打印之前,在所有线程上调用
join
。访问数据的方法似乎您的for
循环只应该是if
check?List List List=myMap.get(firstmodule);if(List==null){List=new ArrayList();myMap.put(firstmodule,List);}list.add(gcd);
(这样就不需要使用if(myMap.size()>0){…}else{…}
,并使其更具可读性)看一看像这样的线程通信讨论同一个问题与此有关,这是Quoi的解决方案。Join等待线程死亡。我如何知道所有线程何时完成。谢谢。布尔标志在每个线程中都起作用?应该在哪里检查条件?
//Only one thread should executes the following code
synchronize{
for (Map.Entry<BigInteger, ArrayList<BigInteger>> entry : myMap.entrySet()) {
System.out.println("key ->" + entry.getKey() + ", value->" + entry.getValue());
}
}