首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java中的进程与线程

Java中的进程与线程
EN

Stack Overflow用户
提问于 2014-08-16 17:20:21
回答 2查看 6.3K关注 0票数 5

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

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

代码(不是仅仅为了有一个想法而完成的):

代码语言:javascript
运行
复制
 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(...)
     }
} 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-16 17:27:09

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

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

我看到每个进程每分钟可以进行6-7次编辑。

每次编辑10秒听起来都很长。也许有必要使用CPU分析器来优化您的代码以提高性能。

票数 6
EN

Stack Overflow用户

发布于 2014-08-18 13:22:58

首先,您不正确地使用线程。线程确实是可运行的,所以您可以将它们提交给执行器,但是它们不会以线程的形式运行。执行器将在它自己的线程上运行run()方法。以上代码的并行执行量取决于您正在使用的执行器。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25342089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档