快速说明:这里是 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();
}
}
最佳答案
关于java - 当所有线程完成处理时运行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4591281/