我有两个任务,一个用于下载,另一个用于解压缩;
public class DownloadUtil {
public static void downloadHtml(MainViewController controller, String dns, int port, String offlineUUID, String filePath, Map<String, String> cookies) throws IOException {
String urlHtml = "http://" + dns + ":" + port + Constants.TARGET_SERVICE_DOWNLOADFILES + offlineUUID;
System.out.println(urlHtml);
Executors.newSingleThreadExecutor().execute(new DownloaderTask(controller, urlHtml, filePath, cookies));
}
和
public class UnzipUtil {
public static void unZipIt(String zipFile, String outputFolder) {
Executors.newSingleThreadExecutor().execute(new UnzipTask(zipFile, outputFolder));
}
}
我以这种方式在我的代码中调用它们:
DownloadUtil.downloadHtml(this, dns, port, uuid, filePathHtmlDownload, cookies);
UnzipUtil.unZipIt(filePathHtmlDownload, outputFolder);
但问题是Unzip方法是在下载方法完成之前调用的,我怎样才能unZipIt等待downloadHtml方法?
答案 0 :(得分:4)
将相同的SingleThreadExecutor
传递给两种方法。然后,Executor
按顺序完成您的任务。
Executor e = Executors.newSingleThreadExecutor();
DownloadUtil.downloadHtml(e, this, dns, port, uuid, filePathHtmlDownload, cookies);
UnzipUtil.unZipIt(e, filePathHtmlDownload, outputFolder);
现在你的方法看起来像:
public class DownloadUtil {
public static void downloadHtml(Executor e, MainViewController controller, String dns, int port, String offlineUUID, String filePath, Map<String, String> cookies) throws IOException {
...
e.execute(new DownloaderTask(controller, urlHtml, filePath, cookies));
}
答案 1 :(得分:-1)
看看CountDownLatch。这对你的情况很有帮助。您可以为两个线程创建一个锁存器,当下载完成后,您可以执行countDown()
。在解压缩开始时,您可以放置latch.await()
之类的内容。因此,只有在下载完成后才会启动解压缩。