我有一个大的单线程java程序,在输出结果之前需要很长时间。我正在考虑让它并发,但这让我想知道:并发对我的应用程序有帮助吗?它真的会有所帮助吗?
因此,我在这里问:
我应该寻找哪些属性( in my program )才能说明 多线程/并发是要走的路?
这有什么重击规则吗?
答案 0 :(得分:3)
只要您的程序可以分解为多个彼此独立的并行可执行任务,就应该使用多线程。 例如,
int main() {
for (i=0;i<5;i++)
fprintf("this is for task1") // consider this function is writing data to file for task1
for (i=0;i<5;i++)
fprintf("this is for task2") // consider this function is writing data to file for task2
return 0;
}
在这里我们可以看到写入file1和file2可以并行完成,因为它们完全相互独立。因此,这里可以使用多线程同时运行这两个任务。
但在多线程之前,你应该考虑一些事情,
你可以在没有多线程的情况下改进吗?
在上面的代码中,我们可以在不使用多线程的情况下进行一些改进,
int main(){
for (i=0;i<5;i++) {
fprintf("this is for task1")
fprintf("this is for task2")
}
返回0; }
这里我们可以避免不需要的第二个循环。这里我们不能避免连续文件写入,但我们比以前有了一些改进(不要再考虑它了,这只是一个例子:))
希望你现在明白:)
答案 1 :(得分:2)
美好的一天,
并发通常有助于提高算法完成的速度,并且认为算法必须具有固有的多线程可行性。
可行的多线程我的意思是算法的某些部分应该能够分解成不依赖于顺序过程结果的独立部分。例如,如果你有一个循环,每次运行时产生一些结果,但不需要先前的迭代结果,那么你可以创建多个线程并运行每一个而不是循环。这将提高算法完成的速度。
有效性的最佳衡量标准是完成时间。
答案 2 :(得分:1)
在应用程序中查找您认为可以同时执行的任务,然后通过多个线程执行这些任务。
答案 3 :(得分:1)
答案是非常主观的。如果需要以同步方式处理输入,则并发性将不适用。但是,如果您有一个一次为多个请求提供服务的进程,那么这将是一个很好的应用程序。
例如,Servlet API由于其高度并发性而具有多线程性 - 它必须并行处理大量独立请求。如果您有一个与主应用程序线程异步运行的重复进程,例如每5分钟轮询一次新数据的进程,这也是一个很好的用法。但是,如果它是一个用户启动的进程,应该阻塞直到它完成,那么生成一个单独的线程就没有价值。
不应该问“我应该实现并发吗?”,而应该问“如何从并发中获益?”您可以为几乎任何您想要的东西添加并发性,但诀窍在于能够根据具体情况确定异步/并发地运行任务是否提供任何好处。