如何做一个执行者等待另一个?

时间:2013-01-29 14:41:23

标签: java runnable

我有两个任务,一个用于下载,另一个用于解压缩;

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方法?

2 个答案:

答案 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()之类的内容。因此,只有在下载完成后才会启动解压缩。