0
我要計算素數呈現數量從1
到10000
,我分了範圍爲8
線程(numbers of my CPU cores
),所以每個線程必須檢查1250
號碼。我不明白爲什麼在程序我」結束m如果這是輸出:的CyclicBarrier上計算質數
numbers found: 0
的WorkerThread:
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class WorkerThread extends Thread {
private CyclicBarrier cyclicBarrier;
private PrimeNumber primeNumber;
private int min;
private int max;
public WorkerThread(CyclicBarrier cyclicBarrier, int min, int max,
PrimeNumber primeNumber) {
this.cyclicBarrier = cyclicBarrier;
this.primeNumber = primeNumber;
this.max = max;
this.min = min;
}
@Override
public void run() {
primeNumber.calculatePrimeNumber(min,max);
try {
cyclicBarrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
primeNumber.printNumbers();
}
}
主要類:
import java.util.concurrent.CyclicBarrier;
public class PrimeNumber {
private Integer totalPrimeNumber;
private int min;
private int max;
private int limit;
public PrimeNumber(int min, int max) {
totalPrimeNumber = new Integer(0);
this.min = min;
this.max = max;
}
public void calculatePrimeNumber(int min, int max) {
boolean found = false;
for (int i = min; i <= max; i++) {
for (int j = 3; j <= Math.sqrt(min); j++) {
if (min % 2 == 0)
break;
else if (min % j == 0) {
found = false;
break;
}
found = true;
}
if (found) {
totalPrimeNumber++;
}
}
}
public void printNumbers() {
synchronized (totalPrimeNumber) {
System.out.println("numbers found" + totalPrimeNumber);
}
}
public void setMin(int min) {
this.min = min;
}
public void setMax(int max) {
this.max = max;
}
public int getMin() {
return min;
}
public int getMax() {
return max;
}
private void setLimit(int max) {
this.limit = max;
}
private int getLimit() {
return limit;
}
public static void main(String args[]) {
int cores = Runtime.getRuntime().availableProcessors();
CyclicBarrier cyclicBarrier = new CyclicBarrier(cores);
PrimeNumber primeNumber = new PrimeNumber(1, 10000);
int numberToCheck = primeNumber.getMax() - primeNumber.getMin();
int numberToDivide = numberToCheck/cores;
primeNumber.setMin(1);
primeNumber.setLimit(primeNumber.getMax());
primeNumber.setMax(numberToDivide);
for (int i = 0; i < cores; i++) {
if (i == 7) {
primeNumber.setMax(primeNumber.getLimit());
WorkerThread workerThread = new WorkerThread(cyclicBarrier,
primeNumber.getMin(), primeNumber.getMax(), primeNumber);
workerThread.start();
} else {
WorkerThread workerThread = new WorkerThread(cyclicBarrier,
primeNumber.getMin(), primeNumber.getMax(), primeNumber);
workerThread.start();
primeNumber.setMin(primeNumber.getMax() + 1);
primeNumber.setMax(primeNumber.getMax() + numberToDivide);
}
}
}
}
你是對的......分心...... – user582040 2014-11-05 16:11:24
我可以請你澄清'calculatePrimeNumber'嗎?我在這裏有疑問,如果每個trhreads同時進入這裏,他們可以互相干擾嗎?我想不,因爲變數都是本地的。 – user582040 2014-11-05 16:14:46
@ user582040你是對的,他們不能干涉,因爲每個方法都傳遞了一個本地到該線程的副本。 – 2014-11-05 16:18:31