Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的进程与线程_Java_Multithreading_Optimization_Process - Fatal编程技术网

Java中的进程与线程

Java中的进程与线程,java,multithreading,optimization,process,Java,Multithreading,Optimization,Process,在我阅读的问题中,我们建议使用线程而不是进程,因为线程更快。我决定用我的程序中的线程来编辑维基百科中某个类别的文章。 程序获取要编辑的文章列表,然后将这些文章分成10个线程。通过这种方式,我每分钟编辑6-7次,速度与我没有使用线程的速度相同。当我启动程序的多个实例并为每个实例指定一个要处理的类别时,我发现每个进程每分钟可以进行6-7次编辑(我用5个进程进行了测试) 在我的例子中,为什么流程要快得多?为什么线程没有改变什么 代码(不完全是为了有一个想法): publicstaticwiki=new

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

在我的例子中,为什么流程要快得多?为什么线程没有改变什么

代码(不完全是为了有一个想法):

publicstaticwiki=newwiki();
公共程序(){
String[]articles=wiki.getArticles(类别);
对于(int i=0;i<10;i++){
String[]part=getPart(articles,i,10);
MyThread t=新的MyThread(部分);
列表。添加(t);
}
ExecutorService.invokeAll(list);//我不确定函数的语法
}
公共类MyThread扩展线程{
公共字符串[]文章;
公共MyThread(字符串[]文章){
这个.文章=文章;
}
公开募捐{
//一些逻辑
wiki.edit(…)
}
} 

每个进程都有许多线程来完成其工作。如果有一个进程有N个线程,或者有N个进程有1个线程,那么除了

  • 线程更轻,开销略小。它们产生的差异是以毫秒为单位的,所以你不太可能在这里获得
  • 使用更多进程,间接地允许程序使用更多内存(因为每个进程都有一个有限的堆大小,您可以更改)。如果要有N个进程,公平的比较是将每个进程的内存限制为内存量的1/N
  • 更可能发生的情况是,您正在像锁一样限制共享资源。这意味着您的程序无法有效地使用额外的线程,因此附加的线程几乎没有价值。通过使用多个进程,可以断开线程之间的连接
我发现每个进程每分钟可以进行6-7次编辑


每次编辑耗时10秒,听起来相当长。也许有必要使用CPU分析器优化代码以提高性能。

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


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

线程与进程不是由速度(通常)决定的选择;这取决于你想要达到的行为。如果您的多线程代码没有显示加速,那么我建议您有一个bug。@BoratSagdiyev我已经添加了代码。这不是全部代码,但你可以知道它是如何工作的。你在所有线程之间共享一个静态变量。我今天把水晶球忘在家里了,但我要说的是,这个库是同步的…@Voo,你能解释一下吗?你的第二点忽略了一个进程与线程相比,内存开销相当大,但这仍然提供了一个合理的概述。@PeterLawrey 6-7编辑是对的,我在维基百科上看到的所有机器人都有这样的速度。我的函数很简单,获取文本并替换某些内容,然后提交。@user230137如果您使用的是底层库,它可能是单线程的,或者是故意限制的。您的回答是正确的。我还没有查看编辑功能。每6-7次编辑都是由我使用的库引起的,因为它使用阻塞IO。
 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(...)
     }
}