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 什么';在这种情况下使用Thread.Join()的想法是什么?_Java_Multithreading - Fatal编程技术网

Java 什么';在这种情况下使用Thread.Join()的想法是什么?

Java 什么';在这种情况下使用Thread.Join()的想法是什么?,java,multithreading,Java,Multithreading,我有一个生成MD5校验和的小Java程序的代码。它一次只能处理一个文件。当给定文件名时,它会打开一个模式对话框,其中显示进度条和总体状态。在“100%”时,此对话框关闭,程序显示生成的MD5,然后准备获取另一个文件 生成MD5的函数位于实现Runnable的类中,然后将该类传递给Thread实例。然后这个Thread对象被用作Thread.start();thread.join()。该程序一次只能处理一个文件。当我使用没有线程的函数时,它工作得非常好 我的问题是:将它放在一个单独的线程中并加入它

我有一个生成MD5校验和的小Java程序的代码。它一次只能处理一个文件。当给定文件名时,它会打开一个模式对话框,其中显示进度条和总体状态。在“100%”时,此对话框关闭,程序显示生成的MD5,然后准备获取另一个文件

生成MD5的函数位于实现
Runnable
的类中,然后将该类传递给
Thread
实例。然后这个
Thread
对象被用作
Thread.start();thread.join()
。该程序一次只能处理一个文件。当我使用没有线程的函数时,它工作得非常好


我的问题是:将它放在一个单独的线程中并加入它的目的是什么?

在没有看到代码的情况下,我猜一个线程计算校验和,另一个线程处理进度条,必要时更新其值,但您需要将代码添加到您的帖子中,让我们帮助您

join方法允许一个线程等待另一个线程的完成,因此它是完成应用程序执行的一种方式,确保两个线程都结束线程。join()定义如下:

等待此线程死亡

线程联接通常用于使主线程等待其他线程完成其进程。当然,这是假设连接是从主线程调用的


我猜代码会阻止用户交互,直到MD5计算完成

正如我在中所提到的,如果您将耗时的任务保留在程序的主GUI进程中,您应该知道,只要任务正在运行,它就不会响应任何用户交互

在中,您可以找到一些关于Java应用程序中异步操作的良好实践(它主要关注Swing,但可以广泛应用于其他Java编码策略)。我想强调其中一个主题:

规则2:不要在事件线程上运行耗时的操作

我将不断重复这一点:Swing对所有GUI事件使用单个线程。如果您的事件处理程序正在通过网络上载一个多兆字节的文件,那么这些事件将被延迟,直到您完成为止。这条规则涉及到一个平衡行为:某些操作(例如获取文件大小)非常快,不会中断用户。然而,这并不是你漫不经心的理由,因为总有一天你的用户会得到一个文件的大小,这个文件驻留在一个有间歇性网络连接的文件服务器上

正如您所提到的,对话框在生成MD5时保持打开状态。这就是开发人员使用单独线程的原因——即使知道程序一次只能处理一个文件,通过在自己的线程中隔离计算,也可以避免在计算MD5时冻结主GUI

然而。也就是说,开发人员可能已经使用此策略来阻止额外的用户交互,直到MD5计算完成。或者,也可以在主程序(或GUI)完成(关闭)之前等待MD5计算完成

然后这个线程对象被用作Thread.start();thread.join()

它真的在做类似于:

Thread thread = new Thread(new MD5ProcessorRunnable(...));
thread.start();
thread.join();
...
如果是这样的话,这是一个非常奇怪的模式。代码没有理由不能在当前线程中直接调用MD5处理器

我怀疑它所做的事情相当于:

MD5ProcessorRunnable processor = new MD5ProcessorRunnable(...);
Thread progressBarThread = new Thread(new ProgressBar(processor));
progressBarThread.start();
Thread md5Thread = new Thread(processor);
md5Thread.start();
md5Thread.join();
progressBarThread.join();
...

这将启动一个线程,该线程更新进度条,并且仅在两个线程完成后才将GUI控制返回给用户。

“我有一个生成MD5校验和的小型Java程序的代码”如果您显示代码,就更容易得出这个想法。当您使用其他人的代码时,不一定认为他们知道自己在做什么。但是,即使不能查看代码,我也会假设使用了多线程,以便在校验和生成线程运行时更新进度后面紧跟着
t.join()中间没有任何内容。但是你还没有给我们看代码。真的是这样吗?在您描述的应用程序中,有一个很好的理由可以在不同的线程中计算校验和,而不是在制作进度条动画的线程中计算校验和。thread.join()是否会暂停调用它的线程的执行?那个挂起的线程还能更新进度条吗?哦,thanx,Bruno Toffalo。这正是我想知道的!很高兴知道这有帮助!:)但是如果主GUI“进程”(thread right?)分叉MD5线程,然后使用
thread.join()
等待它,那么它也可以直接调用MD5方法,对吗?在本例中,是的。调用
thread.join()
将建立一个依赖关系,该依赖关系等同于直接顺序调用该方法——事实上,直接调用该方法在性能方面会更快,因为它不会有创建和终止新线程的全部开销。除非像您在回答中提到的那样,涉及的线程不止一个,否则线程策略的实际用例是什么。