숙제는 모든 것이 적절해야하는 병렬 처리를 사용하여 프로젝트를 작성하는 것이 었습니다. 그러나 프로젝트를 만들었지 만 교수님이 내 코드에서 뭔가 잘못되었다고 언급했습니다. "배열 목록을 보시고, 뭔가 괜찮은지, 아마도 동기화가 아닌지 확인해주십시오."동기화 된 arraylist를 사용한 병렬 작업
커뮤니티에 저를 도울 것을 요청하고 잘못 될 수 있음을 지적하고 싶습니다. 나는 그것이 내 배열리스트를 괄호로 묶어서 synchronize
을 덮지 않는 것이 문제라고 생각한다. 맞습니까? 내가 바로이 부분을 변경
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* My project finds all dividors for specific number
*It must use threads, so I made them. First I start them (first loop)
*then join them (second loop). My project must have that loops.
*Problem might be with not synchronizing methods array list...
*/
public class Main {
private final static int NUMBER = 100;
private final static List<Integer> dividors = new ArrayList<Integer>();
public static void main(String[] args) {
new Main().doStuff();
}
private int sqr;
private int sqrp1;
private void doStuff() {
sqr = (int) Math.sqrt(NUMBER);
sqrp1 = sqr + 1;
Thread[] t = new Thread[sqrp1];
//starting tasks
for (int i = 1; i < sqrp1; i++) {
final int it = i;
if (NUMBER % i == 0) {
final int e = i;
t[i] = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("sta"+e);
if (!checkContains(e)) {
addElement(e);
}
final int dividednumber = NUMBER/e;
if (!checkContains(dividednumber)) {
addElement(dividednumber);
}
}
});
t[i].start();
}
}
//calling join for tasks
for (int i = 1; i < sqrp1; i++) {
final int it = i;
if (NUMBER % i == 0) {
try {
System.out.println("sto"+i);
t[i].join();
} catch (InterruptedException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
System.out.println("xxx");
Collections.sort(dividors);
Integer[] arrayDividors = dividors.toArray(new Integer[0]);
for (int i = 0; i < arrayDividors.length; i++) {
System.out.println(arrayDividors[i]);
}
}
private synchronized void addElement(int element) {
dividors.add(element);
}
private synchronized boolean checkContains(int element) {
return dividors.contains(element);
}
}
오전, 지금은 괜찮아?
t[i] = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("waiting " + e);
synchronized (this) {
System.out.println("entering " + e);
if (!checkContains(e)) {
addElement(e);
}
final int dividednumber = NUMBER/e;
if (!checkContains(dividednumber)) {
addElement(dividednumber);
}
System.out.println("leaving " + e);
}
}
});
BTW 조건에 'i <= sqrp1'을 써야합니다. 그렇지 않으면 제곱 숫자에 요인이 누락됩니다. 이 문제와 관련된 –