我已经开始了一个切换按钮按下线程。现在我想在再次按下切换按钮时停止该线程。但是线程。stop()
API已被弃用。所以,我得到了不支持的操作异常。我不知道如何使用TimerTask来替代它。以下是我的示例代码:
//AudioDispatcher implements a Runnable
public class AudioDispatcher implements Runnable
//This is a code to start a thread
AudioDispatcher dispatcher = AudioDispatcherFactory.fromDefaultMicrophone(22050,1024,0);
Thread t1 = new Thread(dispatcher,"Audio Dispatcher");
t1.start();
您可以尝试这个时间任务示例;
private static final int DEFAULT_DELAY_TIME = 1000;
private static final int DEFAULT_PERIOD = 1000;
private Timer mPlayTimer;
private TimeTask mPlayPlanTask;
private void startTask() {
configTimer();
mPlayTimer.schedule(mPlayPlanTask, DEFAULT_DELAY_TIME,
DEFAULT_PERIOD);
}
}
private void stopTimer() {
if (mPlayTimer != null) {
mPlayTimer.cancel();
mPlayTimer = null;
}
if (null != mPlayPlanTask) {
mPlayPlanTask.cancel();
mPlayPlanTask = null;
}
}
private void configTimer() {
if (null == mPlayTimer) {
mPlayTimer = new Timer();
}
if (null == mPlayPlanTask) {
mPlayPlanTask = new TimerTask() {
@Override
public void run() {
// Do some work;
}
};
}
}
创建标志并根据标志停止
class Server implements Runnable{
private volatile boolean exit = false;
public void run() {
while(!exit){
System.out.println("Server is running.....");
}
System.out.println("Server is stopped....");
}
public void stop(){ exit = true; }
}
现在开始和停止
Server myServer = new Server();
Thread t1 = new Thread(myServer, "T1");
t1.start();
//Now, let's stop our Server thread
System.out.println(currentThread().getName() + " is stopping Server thread"); myServer.stop();
不能在执行过程中简单地停止线程。如果要在执行过程中停止线程,可以调用thread。中断()
方法。
public class SomeBackgroundProcess implements Runnable {
Thread backgroundThread;
public void start() {
if( backgroundThread == null ) {
backgroundThread = new Thread( this );
backgroundThread.start();
}
}
public void stop() {
if( backgroundThread != null ) {
backgroundThread.interrupt();
}
}
public void run() {
try {
Log.i("Thread starting.");
while( !backgroundThread.interrupted() ) {
doSomething();
}
Log.i("Thread stopping.");
} catch( InterruptedException ex ) {
// important you respond to the InterruptedException and stop processing
// when its thrown! Notice this is outside the while loop.
Log.i("Thread shutting down as it was requested to stop.");
} finally {
backgroundThread = null;
}
}
问题内容: 问题答案: 调用stop的替代方法是使用中断向线程发出信号,告知你希望它完成其工作。(这假设你要停止的线程行为良好,如果它在抛出异常后立即通过吃掉它们而忽略了InterruptedException,并且不检查中断状态,那么你将返回使用stop()。) 下面是一些代码,我写的一个答案,一个线程的问题在这里,它的线程中断,将如何工作的例子: 要注意的一些事情: 中断原因并立即抛出,否则你
问题内容: 我在对此答案的评论中阅读了有关过时的计划(抱歉,没有参考)的其他许多问题。我真的希望不要,因为我将它用作Java中调度事情的简便方法(而且效果很好)。但是,如果过时了,我会去别处。 但是,快速浏览 1.6版 的API文档并没有说明它已被弃用。Sun的“ 不推荐使用的清单”中甚至都没有提到它。 是否正式弃用 *,如果是,我应该使用什么代替? 另一方面, 如果不弃用它,* 人们是否可以停止
问题内容: 您已经意识到了一个古老的问题:包含浮动元素的容器不会自动扩展其高度以围封其子级。 解决此问题的一种方法是“clearfix”,它添加了许多CSS规则以确保容器正确延伸。 但是,仅提供容器似乎同样有效,并且具有相同的浏览器兼容性。 这是否意味着不建议使用“ clearfix”?使用它还有什么优势吗? 这里有一个非常相似的问题:clearfixhack和overflow:hidden与ov
问题内容: 如您所愿,您可以在Java 8中使用lambda,例如,以替换匿名方法。 可以在此处看到Java 7与Java 8的示例: 可以用Java 8中的以下两种方式表示: 要么 这是因为它是一个功能接口,仅具有一个(抽象的)公共非默认方法。 但是…因为我们有以下几点: 看起来很熟悉吧? 但是,使用lambda表达式不起作用,因为它是一个抽象类,即使它只有一个抽象的公共非默认方法,它也不是接口
如您所知,您可以在Java 8中使用lambdas来代替匿名方法。 这里可以看到Java 7与Java 8的对比示例: 在Java 8中可以用以下两种方式表示: 或 这是因为Runnable是一个函数接口,只有一个(抽象的)公共非默认方法。 但是...对于,我们有以下内容: 看起来很眼熟吧 但是,使用lambda表达式不起作用,因为TimerTask是一个抽象类,即使它只有一个抽象公共非默认方法,
问题内容: 今天,我决定将我的android应用程序从Java转换为Kotlin!:)但是,当我输入以下内容时,我感到非常惊讶: 然后Android Studio告诉我:“’getActionView(MenuItem!):View!’ 已弃用。Java中已弃用“ 因此,在问您解决方案之前,我先问谷歌解决方案是什么,我相信我找到了解决方案:“直接使用getActionView()”。 所以我像这样