我刚读完这篇文章:Java-5 ThreadPoolExecutor相对于Java-7 ForkJoinPool有什么优势?觉得答案不够直接.
您能用简单的语言和示例来解释,Java 7的Fork-Join框架与旧解决方案之间的权衡取舍是什么?
我还阅读了Google关于Java提示的#1热门提示:何时从javaworld.com 使用ForkJoinPool vs ExecutorService但文章没有回答标题问题时,它主要讨论api差异......
据我所知,我已经编写了下面简单的单线程和多线程程序来检查执行速度.但我的单线程程序执行速度比多线程快,请看下面的程序并提及是否有任何错误.
单线程:
import java.util.Calendar;
public class NormalJava {
public static void main(String[] args) {
System.out.println("Single Thread");
int a = 1000;
int b = 200;
NormalJava nj = new NormalJava();
nj.Add(a, b);
nj.Sub(a, b);
nj.Mul(a, b);
nj.Div(a, b);
Calendar lCDateTime = Calendar.getInstance();
System.out.println("Calender - Time in milliseconds :"
+ lCDateTime.getTimeInMillis());
}
private void Add(int a, int b) {
System.out.println("Add :::" + (a + b));
}
private void Sub(int a, int b) {
System.out.println("Sub :::" + (a - b));
}
private void …Run Code Online (Sandbox Code Playgroud) 我知道答案是没有,这里有一个例子,为什么单线程比Java的多线程更快?.
因此,当在线程中处理任务是微不足道的时,创建线程的成本将比分发任务产生更多的开销.这是一个单线程比多线程更快的情况.
是否有更多情况下单个线程比多线程更快?
我们什么时候应该决定放弃多线程,只使用一个线程来实现我们的目标?
虽然问题标记为java,但也欢迎在Java之外进行讨论.如果我们能在答案中有一个小例子来解释,那将会很棒.
我在mongoDB中有4000万个数据.我正在从集合中并行读取数据,处理它并转储到另一个集合中.
作业初始化的示例代码.
ExecutorService executor = Executors.newFixedThreadPool(10);
int count = total_number_of_records in reading collection
int pageSize = 5000;
int counter = (int) ((count%pageSize==0)?(count/pageSize):(count/pageSize+1));
for (int i = 1; i <= counter; i++) {
Runnable worker = new FinalParallelDataProcessingStrategyOperator(mongoDatabase,vendor,version,importDate,vendorId,i,securitiesId);
executor.execute(worker);
}
Run Code Online (Sandbox Code Playgroud)
每个线程都在做以下事情
public void run() {
try {
List<SecurityTemp> temps = loadDataInBatch();
populateToNewCollection(temps);
populateToAnotherCollection(temps);
} catch (IOException e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
使用以下查询对加载数据进行分页
mongoDB.getCollection("reading_collection").find(whereClause).
.skip(pagesize*(n-1)).limit(pagesize).batchSize(1000).iterator();
Run Code Online (Sandbox Code Playgroud)
机器配置:2个CPU,每个1核
并行实现提供与顺序几乎相同的性能.数据子集的统计数据(319568条记录)
No. of Threads Execution Time(minutes)
1 16
3 15
8 17
10 17
15 …Run Code Online (Sandbox Code Playgroud)