【发布时间】:2016-03-08 22:31:39
【问题描述】:
我目前正在尝试修改我从事的顺序主程序并合并多线程。我想指定拆分工作的线程数量,然后让每个线程运行一个算法来查找素数,然后显示每个线程中有多少个素数。
问题似乎是每个线程都在整个数组上运行算法,它没有在我指定的所需线程中拆分数组。我尝试了其他一些东西,但它们几乎只会导致更多错误。
截至目前,我正在试验一个包含 1000 个数字的数组。一旦我让它工作,我会在数组中放入数百万个数字,但我只想先做更少的数字。 1000 的数组中应该有 168 个素数。问题是每个线程都返回 168 个素数,这让我相信每个线程都在做同样的事情,而不是拆分工作。我的问题是,我怎样才能使用这个程序,让它拆分数组并以这种方式运行算法?所以 0 到 499 将运行算法并显示线程 0 中素数的数量,然后 500 到 1000 将运行 alg 并显示该线程中有多少素数。
这是我的代码 - Prime.java
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Prime extends Thread {
Scanner scan = new Scanner(System.in);
static long [] primes = new long [1000];
static ArrayList<Integer> primeList = new ArrayList<Integer>();
//int max = num;
public int count = 0;
public void run() {
for (int n = 2; n<=primes.length; n++) {
boolean prime = true;
for (int j = 2; j < n; j++) {
if (n%j == 0){
prime = false;
break;
}
}
if (prime){
count++;
primeList.add(n);
}
}
}
}
Worker.java
import java.util.ArrayList;
import java.util.Scanner;
public class Worker {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("How Many threads? ");
int nThreads = scan.nextInt(); // Create variable 'n' to handle whatever integer the user specifies. nextInt() is used for the scanner to expect and Int.
final Prime[] pThreads = new Prime[nThreads];
long startTime = System.currentTimeMillis();
for(int i = 0; i<nThreads; i++){
pThreads[i] = new Prime();
pThreads[i].start();
}
try {
for (int i = 0; i < nThreads; i++)
pThreads[i].join();
} catch (InterruptedException e) {
}
long stopTime = System.currentTimeMillis();
long elapsedTime = stopTime - startTime;
System.out.println("Execution time = : "+ elapsedTime);
System.out.println("----------------------------------------------------");
int cores = Runtime.getRuntime().availableProcessors();
System.out.println("How many Cores this Java Program used: " + cores);
for (int i = 0; i < nThreads; i++)
System.out.println("Thread " + i + " Prime count: " + pThreads[i].count); // Display Thread count
System.out.println("Total prime count: " + Prime.primeList.size()); // Output total amount of primes from the Array List
for (int i = 0; i < 100; i++) // Display first 100 primes.
System.out.println(Prime.primeList);
}
}
任何帮助将不胜感激。谢谢。
【问题讨论】:
-
你的意思是什么?您是想以有效的方式在数组中查找素数,还是想学习如何在 java 中创建线程?
-
@SalvadorDali。显然不是第一个。
-
对不起,我投票结束这个。我理解这个问题的答案,但这是一个关于编写线程安全代码和如何在 Java 中实现共享工作者模式的非常长讲座。你需要在别处找到答案。
-
简单地根据元素总数和线程数计算一组开始和结束索引。给每个线程分配一个来划分工作。
-
@SalvadorDali 在 Java 中创建线程。但我应该在数百万个数字的数组上使用多线程,然后输出素数。
标签: java arrays multithreading algorithm parallel-processing