相关疑难解决方法(0)

Java的Fork/Join vs ExecutorService - 何时使用哪个?

我刚读完这篇文章:Java-5 ThreadPoolExecutor相对于Java-7 ForkJoinPool有什么优势?觉得答案不够直接.

您能用简单的语言和示例来解释,Java 7的Fork-Join框架与旧解决方案之间的权衡取舍是什么?

我还阅读了Google关于Java提示的#1热门提示:何时javaworld.com 使用ForkJoinPool vs ExecutorService但文章没有回答标题问题,它主要讨论api差异......

java concurrency multithreading executorservice fork-join

52
推荐指数
6
解决办法
3万
查看次数

为什么单线程比Java中的多线程更快?

据我所知,我已经编写了下面简单的单线程和多线程程序来检查执行速度.但我的单线程程序执行速度比多线程快,请看下面的程序并提及是否有任何错误.

单线程:

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 multithreading

17
推荐指数
3
解决办法
2万
查看次数

多线程总是比单线程产生更好的性能吗?

我知道答案是没有,这里有一个例子,为什么单线程比Java的多线程更快?.

因此,当在线程中处理任务是微不足道的时,创建线程的成本将比分发任务产生更多的开销.这是一个单线程比多线程更快的情况.

问题

  • 是否有更多情况下单个线程比多线程更快?

  • 我们什么时候应该决定放弃多线程,只使用一个线程来实现我们的目标?

虽然问题标记为,但也欢迎在Java之外进行讨论.如果我们能在答案中有一个小例子来解释,那将会很棒.

java multithreading

12
推荐指数
4
解决办法
1万
查看次数

随着线程池大小的增加,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)

java multithreading processor cpu-cores mongodb

1
推荐指数
1
解决办法
514
查看次数