我的Java代码在单击按钮时创建了一个线程。 每次单击该按钮都会创建一个线程。 如果再次单击按钮,我想杀死前一个线程。 我怎样才能做到这一点? 以下是buttonclicklistener内的部分代码
myThread= new Thread()
{
public void run() {
diff2 = Math.abs(d3.getTime() - d1.getTime());
long diffseconds = diff2 /1000;
final long start = System.currentTimeMillis()/1000;
tv_timecount=(TextView)findViewById(R.id.tv_timeCount);
while(diffseconds>0)
{
tv_timecount.setText(String.valueOf(diffseconds--));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(myThread.isInterrupted())
break;
}
}
};
myThread.start();
我要停止该线程。
答案 0 :(得分:2)
很多方式,
1:使用不建议使用的停止
Thread t = new Thread();
t.start();
t.stop(); //this is deprecated but it stops the thread
2:使用中断
Thread t = new Thread();
t.start();
t.interrupt();
3:使用while循环杀死线程
boolean running = true;
Thread t = new Thread(() -> {
while (running) {
System.out.println("Running");
try { Thread.sleep(100); } catch (Throwable t) {}
}
});
t.start();
running = false;
答案 1 :(得分:1)
您没有提到为什么您无法完全停止线程,所以我假设您可能遇到哪些问题。
1。中断在您的代码中不起作用的主要原因是因为您抓住InterruptedException
并对此打了个电话。但是之后,您应该使用Thread.currentThread().interrupt()
2。您可以同时单击按钮两次或两次以上,因此所有单击都将尝试停止同一线程,但是每次单击都会启动自己的线程,因此,除了其中一个线程外,其他所有线程(或指向他们的指针)将从您那里泄漏。这可以使用同步功能解决。 处理按钮单击的常规代码应类似于以下代码:
private Thread myThread;
private synchronized void buttonClick() throws InterruptedException //NOTE synchronized
{
if (myThread != null) {
myThread.interrupt();
myThread.join();
}
myThread = new Thread(() -> {
diff2 = Math.abs(d3.getTime() - d1.getTime());
long diffseconds = diff2 / 1000;
final long start = System.currentTimeMillis() / 1000;
tv_timecount = (TextView) findViewById(R.id.tv_timeCount);
while (diffseconds > 0) {
tv_timecount.setText(String.valueOf(diffseconds--));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // NOTE: flag interrupt gets set
}
if (myThread.isInterrupted())
break;
}
});
}
答案 2 :(得分:0)
最好的方法是使用一个标志。在您的while方法中引入一个标志,添加逻辑以检查是否设置了标志,然后才在while循环中执行代码。
while(diffseconds>0)
{
synchronized(Object.class){
if(flag == set) break;
}
//your code
}
您可以在其他线程或主要执行中单击按钮时重置/设置标志。