java - 当所有线程完成处理时运行代码

标签 java android multithreading timer

快速说明:这里是 Java 和 Android 菜鸟,我愿意接受你说我很蠢(只要你告诉我原因。)

我有一个 Android 应用程序,它要求我启动来自各个类的多个线程,并且只有在所有线程完成其工作后才前进到下一个 Activity 。我还想添加一个“故障安全”超时,以防线程花费太长时间(HTTP 请求花费太长时间或其他原因)。

我搜索了 Stack Overflow,发现一篇文章说我应该创建一个类来保持打开线程的运行总数,然后使用计时器来轮询所有线程何时完成。

我想我已经创建了一个工作类来为我执行此操作,它尚未经过测试,但在 eclipse 中没有显示错误。

这是正确的实现吗?是否有任何我应该注意的 API(例如 Java 或 Android API 中的类可以用来代替类底部的抽象类?)

package com.dmp.geofix.libs;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.Timer;
import java.util.TimerTask;

public class ThreadMonitor {

    private Timer timer = null;
    private TimerTask timerTask = null;
    private OnSuccess onSuccess = null;
    private OnError onError = null;

    private static ArrayList<Thread> threads;

    private final int POLL_OPEN_THREADS = 100;
    private final int TIMEOUT = 10000;

    public ThreadMonitor() {
        timerTask = new PollThreadsTask();
    }

    public ThreadMonitor(OnSuccess s) {
        timerTask = new PollThreadsTask();
        onSuccess = s;
    }

    public ThreadMonitor(OnError e) {
        timerTask = new PollThreadsTask();
        onError = e;
    }

    public ThreadMonitor(OnSuccess s, OnError e) {
        timerTask = new PollThreadsTask();
        onSuccess = s;
        onError = e;
    }

    public void start() {
        Iterator<Thread> i = threads.iterator();
        while (i.hasNext()) {
            i.next().start();
        }

        timer = new Timer();
        timer.schedule(timerTask, 0, POLL_OPEN_THREADS);
    }

    public void finish() {
        Iterator<Thread> i = threads.iterator();
        while (i.hasNext()) {
            i.next().interrupt();
        }

        threads.clear();
        timer.cancel();
    }

    public void addThread(Thread t) {
        threads.add(t);
    }

    public void removeThread(Thread t) {
        threads.remove(t);
        t.interrupt();
    }

    class PollThreadsTask extends TimerTask {

        private int timeElapsed = 0;

        @Override
        public void run() {
            timeElapsed += POLL_OPEN_THREADS;
            if (timeElapsed <= TIMEOUT) {
                if (threads.isEmpty() == false) {
                    if (onSuccess != null) {
                        onSuccess.run();
                    }
                }
            } else {
                if (onError != null) {
                    onError.run();
                }
                finish();
            }
        }

    }

    public abstract class OnSuccess {
        public abstract void run();
    }

    public abstract class OnError {
        public abstract void run();
    }

}

最佳答案

看看Thread.join

关于java - 当所有线程完成处理时运行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4591281/

相关文章:

android - gradle 2.2.1 错误

java - 为什么在代码编译正常并且设置了类路径时找不到 base64 类

java - 如何在 play 2.1 RC2 中包含 native 库 (JNI)?

android - 支持 gfortran 的代码源?

android - Android 项目的 Gen 文件夹为空

java - JBoss 7 中的多线程问题

swing - Swing 应用程序中的 Jni 字体错误

java链表字符串排序算法

java - 使用可运行的 jar 文件执行时如何解决多线程的 Java 问题?

c#同时执行2个线程