在单独的Thread中停止runnable

时间:2012-12-19 18:30:46

标签: java android multithreading runnable

嘿,我的Android应用程序当前有问题。我正在开始一个额外的线程 实现Excecutor接口:

class Flasher implements Executor {
    Thread t;
   public void execute(Runnable r) {
     t = new Thread(r){
     };
     t.start();
   }
 }

我像这样开始我的Runnable:

flasherThread.execute(flashRunnable);

但我怎么能阻止它?

4 个答案:

答案 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并根据您的要求终止它