所有线程完成处理后运行代码

时间:2011-01-04 06:56:23

标签: java android multithreading timer

快速注释:Java和Android noob在这里,我很乐意告诉你我是傻瓜(只要你告诉我原因。)

我有一个Android应用程序,它要求我启动源自各种类的多个线程,并且只有在所有线程完成其工作后才进入下一个活动。我还想添加一个“failafe”超时,以防一个线程花费太长时间(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();
    }

}

4 个答案:

答案 0 :(得分:2)

检查java.util.concurrent包。 特别是Future,FutureTask和ExecutorService FutureTask允许使用methid isDone()

获取正在执行的操作的状态

我希望这会有所帮助

答案 1 :(得分:2)

查看Thread.join

答案 2 :(得分:1)

所有线程都应该实现可调用,它们应该是未来的任务。

使用countdownlatch / CyclicBarrier启动所有这些以确保所有这些都同时启动

答案 3 :(得分:1)

如果您打算在运行代码后退出应用程序,您可能需要查看Runtime.getRuntime()。addShutdownHook(Thread)以指定在应用程序退出时要执行的线程。