Java 在单独的线程中停止runnable

Java 在单独的线程中停止runnable,java,android,multithreading,runnable,Java,Android,Multithreading,Runnable,嘿,现在我的android应用程序有问题了。我正在通过启动一个额外的线程 实现Excecutor接口: class Flasher implements Executor { Thread t; public void execute(Runnable r) { t = new Thread(r){ }; t.start(); } } 我开始跑步时是这样的: flasherThread.execute(flashRunnable); 但是我

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

class Flasher implements Executor {
    Thread t;
   public void execute(Runnable r) {
     t = new Thread(r){
     };
     t.start();
   }
 }
我开始跑步时是这样的:

flasherThread.execute(flashRunnable);

但是我怎样才能阻止它呢?

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

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

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

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

启动有序关机,执行以前提交的任务,但不接受新任务


好的,这只是非常基本的线程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);
        }
    }
}
然后

编辑:


刚刚偶然发现了关于如何停止线程的非常有用的信息。

我建议使用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秒后强制终止。当然,您可以按照自己的意愿处理未来的ojbect,并根据自己的要求终止它

不要在没有很好理由的情况下实现自己的
执行器
——使用Java API中已有的工具。此外:在Java中,停止在另一个线程中执行的任务总是依赖于另一个线程,或者更确切地说,依赖于它的任务进行协作。如果您的
Runnable
一直处于一个无休止的循环中,基本上什么也不做,那么“没有”方法可以阻止它。@ρ∑ѕρK接口中没有这样的方法。可能重复“允许您控制您的可运行实例”-抱歉,但这不是真的。它们允许您控制
执行器
,但
可运行的
仍然可以执行它喜欢的任何操作,包括不终止并因此弄乱执行器等等。
future.cancel()
方法可能返回false,表示取消请求失败,但是
Future
控制一个
Runnable
实例,而不是可能执行或调度数千个任务的
Executor
,如何通过
未来
影响
可运行
实例?
可运行
的线程将被“中断”-但这并不一定意味着将抛出
中断异常
,或者对
可运行
实例有任何其他影响。因此,如果
Runnable
没有明确地准备好处理外部设置的终止条件,那么有办法阻止它。不过我并没有说它是有保证的。您仍然可以使用
Thread.interrupted()
调用来检查是否调用了
interrupt()
,而不是编写老式代码的音调Java中断线程的标准方法是。。。中断线程。在Runnable中,您可以使用
while(!Thread.currentThread().isInterrupted()){sososomething();}
在发送中断信号时停止正在执行的操作。毫无疑问。-但是,仍然无法强制任意
可运行的
(或线程)终止;在任何情况下都需要
Runnable
的配合。这就是OP的要点:为了能够停止一个正在运行的线程,该线程中的代码必须显式编写以支持这一点。我不是在争论协作位,只是说协作通常是通过中断机制而不是布尔标志来实现的。
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();
}