Java中的进程与线程

时间:2014-08-16 17:20:22

标签: java multithreading optimization process

在我读过的问题中,我们建议在进程上使用线程,因为线程更快。我决定使用我的程序的线程来编辑维基百科中某个类别的文章。 该程序获取要编辑的文章列表,然后在10个线程之间划分文章。通过这个我每分钟进行6-7次编辑,它的速度与我没有使用线程的速度相同。当我启动我的程序的多个实例并为每个实例提供一个要处理的类别时,我看到每个进程可以每分钟进行6-7次编辑(我用5个进程测试过)。

为什么在我的情况下进程要快得多?为什么线程没有改变什么?

代码(不完整只是为了有想法):

 public static wiki = new Wiki();

 public process(){
      String[] articles = wiki.getArticles(category);

      for(int i=0; i< 10; i++){
            String[] part = getPart(articles, i, 10); 
            MyThread t = new MyThread(part);
            list.add(t);
      }
      ExecutorService.invokeAll(list); //I'm not sure about the syntax of the function
 }

public class MyThread extends Thread {
     public String[] articles ;

     public MyThread(String[] articles) {
         this.articles = articles;
     }

     public void run() {
         //some logic
         wiki.edit(...)
     }
} 

2 个答案:

答案 0 :(得分:6)

每个流程都有许多线程可以完成它的工作。如果你有一个具有N个线程的进程或具有1个线程的N个进程,那么除了它之外几乎没有区别。

  • 线程重量更轻,开销略小。它们之间的区别在于毫秒,所以你不太可能在这里获得。
  • 使用更多进程,间接允许程序使用更多内存(因为每个进程具有有限的堆大小,您可以更改)如果您要有N个进程,公平比较是将每个进程的内存限制为1 / N的内存量。
  • 更有可能发生的事情是你在像锁一样的共享资源上存在瓶颈。这意味着您的其他线程添加很少或没有值,因为您的程序无法有效地使用它们。通过使用多个进程,可以中断线程之间的连接。
  

我发现每个进程每分钟可以进行6-7次编辑

每次编辑需要10秒钟听起来很长。也许值得使用CPU分析器优化代码以提高性能。

答案 1 :(得分:1)

首先,您错误地使用了线程。线程确实是Runnables,因此您可以将它们提交给执行程序,但它们不会作为线程运行。执行程序将在它自己的线程上运行run()方法。上面代码的并行执行量取决于您使用的执行程序。

其次,每个线程每秒6-7次编辑听起来很可疑,我想相信更多是可能的。您可能在@PeterLawrey建议的共享资源上存在瓶颈,或者您可能正在使用阻塞IO(或您使用的库使用阻塞IO),在这种情况下,您可以通过增加线程数来增加吞吐量。如果没有一些分析数据,很难说你面临什么样的瓶颈。