Синхронизируйте isPrime
и primeRange
, чтобы избежать одновременного доступа к ним более чем одного потока. Узнайте больше у здесь .
public class Demo {
public static void main(String[] args) throws InterruptedException {
primeGen prime = new primeGen(10, 50);
Thread th1 = new Thread(prime);
th1.setName("Thread1");
Thread th2 = new Thread(prime);
th2.setName("Thread2");
th1.start();
th2.start();
}
}
class primeGen implements Runnable {
private int N1, N2;
private volatile int i;
public primeGen(int n1, int n2) {
this.N1 = n1;
this.N2 = n2;
i = N1;
}
private synchronized boolean isPrime(int N) {
for (int j = 2; j <= N / 2; j++) {
if (0 == N % j) {
return false;
}
}
return true;
}
private synchronized void primeRange(int N1, int N2) {
Thread th = Thread.currentThread();
for (; i <= N2; i++) {
if (isPrime(i)) {
System.out.print(th.getName() + " " + i + " is prime \n");
}
}
}
@Override
public void run() {
primeRange(N1, N2);
}
}