java - Java 中的进程与线程

标签 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(...)
     }
} 

最佳答案

每个进程都有许多线程来完成它的工作。如果您有一个具有 N 个线程的进程或具有 1 个线程的 N 个进程,则除了以下情况之外几乎没有什么区别。

  • 线程的重量更轻,开销也稍微少一些。它们产生的差异以毫秒为单位,因此您不太可能在此处获益。
  • 使用更多进程,间接允许您的程序使用更多内存(因为每个进程都有有限的堆大小,您可以更改)如果您要有 N 个进程,公平的比较是将每个进程的内存限制为内存量的 1/N。
  • 更有可能发生的是您在共享资源(如锁)上遇到瓶颈。这意味着你的额外线程增加很少或没有值(value),因为你的程序无法有效地使用它们。通过使用多个进程,您可以断开线程之间的连接。

I see that each process can do 6-7 edits per minute

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

关于java - Java 中的进程与线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25342089/

相关文章:

java - 当我尝试使用 JSON 数据时,POST 到 Jersey REST 服务时出现错误 415 不支持的媒体类型

java - 使用 onkeydown 方法或覆盖 onbackbuttonpressed 时,Android 后退按钮会卡住

java - 2 个线程修改共享 BlockingQueue 的意外输出

optimization - Hadoop计数器-调整和优化

java - Android:从 "Downloads"文件夹中删除下载的文件快捷方式

c++ - C++线程创建/删除与线程停止/恢复

java - 使用 Java AtomicStampedReference 的算法可以被认为是非阻塞的吗?

javascript - JavaScript 压缩库使用什么技术来最小化文件大小?

c++ - C/C++ 优化检查以查看之前是否已经运行过函数

java - 二维码扫描仪无法在 android 6.0.1 中运行(显示白屏)