嘿,我的Android应用程序当前有问题。我正在开始一个额外的线程 实现Excecutor接口:
class Flasher implements Executor {
Thread t;
public void execute(Runnable r) {
t = new Thread(r){
};
t.start();
}
}
我像这样开始我的Runnable:
flasherThread.execute(flashRunnable);
但我怎么能阻止它?
答案 0 :(得分:5)
好的,这只是非常基本的线程101,但是还有另一个例子:
老派线程:
class MyTask implements Runnable {
public volatile boolean doTerminate;
public void run() {
while ( ! doTerminate ) {
// do some work, like:
on();
Thread.sleep(1000);
off();
Thread.sleep(1000);
}
}
}
然后
MyTask task = new MyTask();
Thread thread = new Thread( task );
thread.start();
// let task run for a while...
task.doTerminate = true;
// wait for task/thread to terminate:
thread.join();
// task and thread finished executing
编辑:
偶然发现了关于如何阻止线程的非常有用的Article。
答案 1 :(得分:3)
不确定实施Executor
是个好主意。我宁愿使用Java提供的一个执行程序。它们允许您通过Runnable
界面控制Future
实例:
ExecutorService executorService = Executors.newSingleThreadExecutor();
Future<?> future = executorService.submit(flashRunnable);
...
future.cancel(true);
当程序不再需要异步执行时,还要确保通过调用ExecutorService
释放executorService.shutdown()
正在消耗的资源。
答案 2 :(得分:1)
您应该查看ExecutorService,而不是实现自己的Executor。 ExecutorService有一个关闭方法:
启动有序关闭,其中执行先前提交的任务,但不接受任何新任务。
答案 3 :(得分:1)
我建议使用ExecutorService和Furure对象,它可以控制执行程序创建的线程。如下例
ExecutorService executor = Executors.newSingleThreadExecutor();
Future future = executor.submit(runnabale);
try {
future.get(2, TimeUnit.SECONDS);
} catch (TimeoutException ex) {
Log.warn("Time out expired");
} finally {
if(!future.isDone()&&(!future.isCancelled()))
future.cancel(true);
executor.shutdownNow();
}
此代码表示runnable将在2秒后被强制终止。当然,您可以根据需要处理您的Future ojbect并根据您的要求终止它