【发布时间】:2018-03-15 21:50:52
【问题描述】:
我是多线程的新手。我有一个 volatile 变量 currentPrimeNo ,它将打印每个新线程的 run 方法中实现的下一个素数。但是每次我将每个线程的 currentPrimeNo 设为 0 时。我应该如何保持全局变量 currentPrimeNo 更新?
public class Processor implements Runnable {
private int id;
private static volatile int currentPrimeNo = 0;
public Processor(int id) {
this.id = id;
}
@Override
public void run() {
System.out.println("Starting process id: " + id);
currentPrimeNo = Utils.generateNextPrime(currentPrimeNo);
System.out.println("Prime Number Associated with this thread is: " + currentPrimeNo);
System.out.println("Completed process id: " + id);
}
}
主要类是:
public class MainClass {
@SuppressWarnings("resource")
public static void main(String[] args) {
System.out.println("****This is where the project starts*****");
Scanner reader = new Scanner(System.in);
System.out.print("Enter number of processes you want to create: ");
int n = reader.nextInt();
ExecutorService executor = Executors.newFixedThreadPool(n);
for(int i=1;i<=n; i++) {
executor.submit(new Processor(i));
}
executor.shutdown();
try {
executor.awaitTermination(10, TimeUnit.MINUTES);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
System.out.println("****This is where the project ends*****");
}
}
下面是 Util 类的 generateNextPrime 方法:
public synchronized static int generateNextPrime(int currentPrime) {
int nextPrime = 2;
if (currentPrime <= 1) {
return nextPrime;
} else {
for (int i = currentPrime + 1;; i++) {
boolean notPrime = false;
for (int j = 2; j < i; j++) {
if (i % j == 0) {
notPrime = true;
break;
}
}
if (notPrime == false) {
return i;
}
}
}
}
下面是我得到的输出:
****这是项目开始的地方*****
输入要创建的进程数:4
启动进程id:2
启动进程id:3
启动进程id:1
启动进程id:4
与此线程相关的质数是:2
与此线程相关的质数是:2
完成的进程ID:4
完成的进程ID:1
与此线程相关的质数是:2
完成的进程ID:2
与此线程相关的质数是:2
完成的进程ID:3
****这是项目结束的地方*****
【问题讨论】:
-
你怎么知道
Utils.generateNextPrime没有错误地返回0?你单独测试过吗? -
是的,我测试过,运行流畅。如果你传递它 0 它给出 2,如果你传递它 2 它给出下一个素数,即 3 等等。
-
请显示最小但完整的示例(即minimal reproducible example),以便其他人可以重现您的错误。您到目前为止显示的代码不足以重现错误。
-
我在原始问题的编辑中添加了主类。
-
可以分享一下
generateNextPrime的内部结构吗?
标签: java multithreading volatile java-threads thread-synchronization