4

嘿,我目前的 android 应用程序有问题。我正在通过实现 Executor 接口启动一个额外的线程:

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

我像这样开始我的 Runnable:

flasherThread.execute(flashRunnable);

但我怎么能阻止它?

4

4 回答 4

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

编辑:

刚刚偶然发现这篇关于如何停止线程的内容非常丰富的文章。

于 2012-12-19T18:52:19.517 回答
3

不确定实施Executor是一个好主意。我宁愿使用 Java 提供的执行器之一。它们允许您通过界面控制您的Runnable实例:Future

ExecutorService executorService = Executors.newSingleThreadExecutor();
Future<?> future = executorService.submit(flashRunnable);
...
future.cancel(true);

当您的程序不再需要异步执行时,还要确保ExecutorService通过调用来释放正在消耗的资源。executorService.shutdown()

于 2012-12-19T18:38:28.733 回答
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();
}

此代码表示可运行对象将在 2 秒后强制终止。当然,您可以随意处理您的 Future 对象,并根据您的要求终止它

于 2014-10-15T20:15:54.907 回答
1

您应该查看 ExecutorService ,而不是实现自己的Executor。ExecutorService 有一个关闭方法,它:

启动有序关闭,其中执行先前提交的任务,但不会接受新任务。

于 2012-12-19T18:39:11.417 回答