Java 在单独的线程中停止runnable
嘿,现在我的android应用程序有问题了。我正在通过启动一个额外的线程 实现Excecutor接口: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); 但是我
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();
}