我有一个按钮监听器,包括一个线程睡眠和另一个按钮监听器。
第二个按钮监听器必须中断此线程,我不知道如何执行此操作:
我的代码:
button1.setOnClickListener (new View.OnClickListener() {
@Override
public void onClick(View v) {
..........
button1.setEnabled(false);
button1.setVisibility(View.GONE);
button2.setVisibility(View.VISIBLE);
button2.setEnabled(true);
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2800);
} catch (InterruptedException e) {
// ???????
}
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
button1.setEnabled(true);
button1.setVisibility(View.VISIBLE);
button2.setEnabled(false);
button2.setVisibility(View.GONE);
}
});
}
}).start();
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
..............
// Thread.interrupted(); -> does not work
}
});
} });
如何让button2监听器中断线程?
答案 0 :(得分:1)
class TestInterruptingThread1 extends Thread{
public void run(){
try{
Thread.sleep(1000);
System.out.println("task");
}catch(InterruptedException e){
throw new RuntimeException("Thread interrupted..."+e);
}
}
b2 //
{
try{
t1.interrupt(); // t1 is the thread to be interrupted
}catch(Exception e){System.out.println("Exception handled "+e);}
}
}
答案 1 :(得分:0)
通过调用thread.interrupt()方法。您还需要将Thread实例保存在类的字段中。
答案 2 :(得分:0)
Thread t = new Thread() {...}
t.start();
并在听众中:
t.interrupt();
至于
// Thread.interrupted(); -> does not work
它将从一个派生自Thread的类中起作用,并且与this.interrupted()
相同; t.interrupted()
将在类定义之外工作。
另请注意,方法isInterrupted()
不会清除中断标记,而interrupted()
会产生清除标记的副作用。
答案 3 :(得分:0)
而不是线程的匿名实现,使线程成为类变量。假设线程的名称是btnOneThread
private Thread btnOneThread;
在需要的地方初始化线程并启动它。
btnOneThread = new Thread( ){...}
btnOneThread.start();
单击按钮2时,请调用
if (btnOneThread != null) {
btnOneThread.interrupt();
}