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_Swing_Download_Wait - Fatal编程技术网

Java等待线程完成

Java等待线程完成,java,multithreading,swing,download,wait,Java,Multithreading,Swing,Download,Wait,我有一个线程正在下载数据,我想等到下载完成后再加载数据。有没有一个标准的方法可以做到这一点 更多信息: 我有一个下载类,它从URL(序列化的POJO)获取数据。下载是可运行和可观察的。它跟踪下载的字节数和下载大小。我有一个进度条,向用户显示进度。GUI观察下载以更新进度条 下载POJO后,我希望获得它并进入下一步。每一步都必须等待上一步完成。问题是我想不出一种方法来暂停我的应用程序以等待下载线程。下载完成后,我想调用download.getObject(),它将以对象的形式返回数据。然后我可以播

我有一个线程正在下载数据,我想等到下载完成后再加载数据。有没有一个标准的方法可以做到这一点

更多信息:

我有一个下载类,它从URL(序列化的POJO)获取数据。下载是可运行和可观察的。它跟踪下载的字节数和下载大小。我有一个进度条,向用户显示进度。GUI观察下载以更新进度条

下载POJO后,我希望获得它并进入下一步。每一步都必须等待上一步完成。问题是我想不出一种方法来暂停我的应用程序以等待下载线程。下载完成后,我想调用download.getObject(),它将以对象的形式返回数据。然后我可以播放它并继续下一次下载

我有一个助手类,它管理要下载的URL并进行所有下载调用。此调用将调用getObject并执行强制转换。Gui调用helper.getUser()。helper启动线程运行,我希望它“知道”何时完成,这样它就可以返回浇铸的对象

有什么建议/例子吗?我在这个设计的开始阶段,所以我愿意改变它

谢谢你

更新:


我遵循和使用模态块,直到线程完成。代码非常混乱,我不喜欢这种方法。我将继续尝试找到一种“干净”的方法来处理下载进程的工作流。

线程有一种方法可以为您这样做,它会一直阻止,直到线程完成执行。

通常,当您要等待线程完成时,您应该调用它。

我想您是在后台线程中调用您的下载,如SwingWorker提供的。如果是这样,那么只需在同一SwingWorker的doInBackground方法中按顺序调用下一个代码。

具有可用于执行任务的
doInBackground()。您可以选择调用
get()
并等待下载完成,或者可以覆盖
done()
方法,该方法将在SwingWorker完成后在事件调度线程上调用

Swingworker对您当前的方法具有优势,因为它具有许多您正在寻找的功能,因此无需重新发明轮子。您可以使用
getProgress()
setProgress()
方法代替runnable for download progress上的观察者。如上所述的
done()
方法是在worker完成执行并在EDT上执行后调用的,这允许您在下载完成后加载数据

有什么建议/例子吗?我跟着。。。代码非常混乱,我不喜欢这种方法


不要使用等待完成的
get()
,而是使用
process()
setProgress()
来显示中间结果,如本简单或相关说明所示。

您可以使用
java.util.concurrent
包中的
CountDownLatch
。在等待一个或多个线程完成后再继续在等待的线程中执行时,它非常有用

例如,等待三项任务完成:

CountDownLatch latch = new CountDownLatch(3);
...
latch.await(); // Wait for countdown
当其他线程完成任务时,它们将分别调用
latch.countDown()
。一旦倒计时完成,在本例中为3,执行将继续。

该方法允许一个线程等待另一个线程完成。但是,与睡眠一样,join的计时取决于操作系统,所以,您不应该假设join将完全按照您指定的时间等待。

更好的方法替代方法已经发展了一段时间

这是一种选择

执行给定的任务,当所有任务完成时,返回一个保存其状态和结果的未来列表。Future.isDone()对于返回列表的每个元素都为true

请注意,已完成的任务可以正常终止,也可以通过引发异常终止。如果在执行此操作时修改了给定集合,则此方法的结果是未定义的

或提供其他替代方案以达到相同目的

示例代码段:

import java.util.concurrent.*;
导入java.util.*;
公共类InvokeAllDemo{
公共InvokeAllDemo(){
System.out.println(“创建服务”);
ExecutorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
List futureList=新建ArrayList();
对于(int i=0;i您可以使用
join()
等待所有线程完成。在创建线程时,将线程的所有对象保留在全局数组列表中。之后,将其保留在循环中,如下所示:

for (int i = 0; i < 10; i++) 
{
    Thread T1 = new Thread(new ThreadTest(i));                
    T1.start();                
    arrThreads.add(T1);
} 

for (int i = 0; i < arrThreads.size(); i++) 
{
    arrThreads.get(i).join(); 
}
for(int i=0;i<10;i++)
{
螺纹T1=新螺纹(新螺纹试验(i));
T1.start();
添加(T1);
} 
对于(int i=0;i

检查此处以了解完整的详细信息:

我尝试了join(),但这阻止了GUI的更新。我使用线程的原因是在下载过程中保持GUI的更新。调用join可阻止这种情况发生。join()可以。如果GUI停止更新,您可能需要更详细地了解您要加入的线程。我不会加入EDT。然后您需要确保您没有调用
join()
在swing线程中。您可以通过创建一个负责下载线程的线程来完成此操作。这基本上只是一个后台工作线程,您可以忽略它。正是工作线程知道下载何时完成以及此时要做什么。您只需确保在swing中完成对swing对象的编辑g螺纹。
join()
不会重新拉伸超过
for (int i = 0; i < 10; i++) 
{
    Thread T1 = new Thread(new ThreadTest(i));                
    T1.start();                
    arrThreads.add(T1);
} 

for (int i = 0; i < arrThreads.size(); i++) 
{
    arrThreads.get(i).join(); 
}