Java中的进程与线程
在我阅读的问题中,我们建议使用线程而不是进程,因为线程更快。我决定用我的程序中的线程来编辑维基百科中某个类别的文章。 程序获取要编辑的文章列表,然后将这些文章分成10个线程。通过这种方式,我每分钟编辑6-7次,速度与我没有使用线程的速度相同。当我启动程序的多个实例并为每个实例指定一个要处理的类别时,我发现每个进程每分钟可以进行6-7次编辑(我用5个进程进行了测试) 在我的例子中,为什么流程要快得多?为什么线程没有改变什么 代码(不完全是为了有一个想法):Java中的进程与线程,java,multithreading,optimization,process,Java,Multithreading,Optimization,Process,在我阅读的问题中,我们建议使用线程而不是进程,因为线程更快。我决定用我的程序中的线程来编辑维基百科中某个类别的文章。 程序获取要编辑的文章列表,然后将这些文章分成10个线程。通过这种方式,我每分钟编辑6-7次,速度与我没有使用线程的速度相同。当我启动程序的多个实例并为每个实例指定一个要处理的类别时,我发现每个进程每分钟可以进行6-7次编辑(我用5个进程进行了测试) 在我的例子中,为什么流程要快得多?为什么线程没有改变什么 代码(不完全是为了有一个想法): publicstaticwiki=new
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
- 更可能发生的情况是,您正在像锁一样限制共享资源。这意味着您的程序无法有效地使用额外的线程,因此附加的线程几乎没有价值。通过使用多个进程,可以断开线程之间的连接
每次编辑耗时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(...)
}
}