所有线程完成后如何运行代码

时间:2016-06-21 07:22:17

标签: android multithreading executorservice

我是线程新手,我在堆栈溢出中经历了很多帖子并为我的问题找到了很多解决方案,但我不确定哪一个最适合哪种情况。

  

首先,我的问题是我想更新一个JSON文件   当所有线程都在特定路径生成位图时完成   我可以得到所有这些图像并更新JSON文件。所以   简单的单词我想在所有线程完成后运行一些代码   执行和主要要求是我不希望我的主要被阻止。

我发现了什么

  • 线程。加入
  • excutorServive
  • android-priority-jobQueue (link)
  • 线程池中的互斥锁(如果有其他任何内容,也让我知道)
  

我很困惑哪一个是解决我问题的最佳方法。如果有的话   android专家在那里可以总结一下这两个   scenerio什么是Android中最好的。

  • 等到所有线程完成
  • 等待并在完成所有操作后获得通知

3 个答案:

答案 0 :(得分:0)

你可以拥有你的线程的计数器,在每个线程完成后检查已完成的数量,如果不是全部完成,则增加已完成线程的数量,然后完成的最后一个线程将运行该段代码。

答案 1 :(得分:0)

你可以这样做。

在你的主题中:

private Runnable runnableThread= new Runnable() {
    @Override
    public void run() {
        try {
            if (lastThreadDone){
                handler.sendEmptyMessage("SUCCESS");
            }
        }
        catch (Exception ex) {
            throws ex;
        }
    }
};

lastThreadDone是boolean,如果进程完成,它将变为true,这取决于你如何实现它。

然后在你的处理程序中:

@SuppressLint("HandlerLeak")
private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        try {
            switch (msg.what) {
                case "SUCCESS": {
                    // your code here 
                    break;
                }
                case "FAIL":
                    break;
                default:
                    break;
            }
        }
        catch (Exception ex) {
            throw ex;
        }
        super.handleMessage(msg);
    }
};

答案 2 :(得分:0)

我会使用completion service,然后轮询直到所有任务完成。完成后,json文件会更新。问题是您需要执行此异步操作,否则您可能会阻止ui。因此,我将使用完成服务封装工作intent service。如果您需要更新ui,则可以从意向服务发布local broadcasts

此外,对你来说

  • 等到所有线程完成时

    • 只有当您已经使用像意向服务或异步任务
    • 这样的后台线程时才执行此操作
  • 等待并在完成所有操作后获得通知