如題,求答案,最好能說下具體思路和貼下代碼實作
uj5u.com熱心網友回復:
比如找到的最新質數是37
把100000 分成4段
(0,25000] ,(25000,50000],(50000,75000],(75000,100000]
4個分段內,找到第一個37的倍數。
(0/37+1) * 37 =37, (25000/37 + 1)*37=25012, (50000/37 + 1)*37=50024,(75000/37 + 1)*37=75036
四個執行緒分別拿著這個起始數,按37步長自增,打標記。
uj5u.com熱心網友回復:
我先占個位
uj5u.com熱心網友回復:
forkjoin?
uj5u.com熱心網友回復:
package com.buba.threadpool;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
/**
* 需要自己修改
*/
public class T07_ParallelComputing {
public static void main(String[] args) throws ExecutionException, InterruptedException {
long start = System.currentTimeMillis();
List<Integer> list = getPrime(1, 200000);
long end = System.currentTimeMillis();
System.out.println("普通計算耗時:"+(end-start));
System.out.println("=================================");
final int cpuCoreNum = 4;
ExecutorService service = Executors.newFixedThreadPool(cpuCoreNum);
MyTask task1 = new MyTask(1, 80000);
MyTask task2 = new MyTask(80001, 130000);
MyTask task3 = new MyTask(130001, 170000);
MyTask task4 = new MyTask(170001, 200000);
Future<List<Integer>> f1 = service.submit(task1);
Future<List<Integer>> f2 = service.submit(task2);
Future<List<Integer>> f3 = service.submit(task3);
Future<List<Integer>> f4 = service.submit(task4);
start = System.currentTimeMillis();
f1.get();
f2.get();
f3.get();
f4.get();
service.shutdown();
end = System.currentTimeMillis();
System.out.println("并行計算耗時:"+(end-start));
/**
* D:\JAVA\jdk\bin\java.exe
* 普通計算耗時:1585
* =================================
* 并行計算耗時:531
*/
}
static class MyTask implements Callable<List<Integer>> {
int startPos,endPos;
public MyTask(int startPos, int endPos) {
this.startPos = startPos;
this.endPos = endPos;
}
@Override
public List<Integer> call() throws Exception {
List<Integer> list = getPrime(startPos, endPos);
return list;
}
}
//判斷一個數是不是質數
static boolean isPrime(int num){
for (int i = 2; i < num/2; i++) {
if (num%i==0) return false;
}
return true;
}
static List<Integer> getPrime(int start,int end){
List<Integer> results = new ArrayList<>();
for (int i = start; i < end; i++) {
if (isPrime(i)) results.add(i);
}
return results;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/31528.html
標籤:其他技術討論專區
上一篇:python 用nelder-mead對函式進行優化時,初始值不同,得到優化值也不同。
下一篇:自動爬蟲!
