如何通过按钮侦听器中断线程
How to interrupt a thread by button listener
我有一个按钮侦听器 包括一个线程睡眠和另一个按钮侦听器。
第二个按钮侦听器必须中断此线程,我不知道该怎么做:
我的代码:
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 侦听器中断线程?
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);}
}
}
通过调用 thread.interrupt() 方法。您还需要将 Thread 实例保存在 class.
的字段中
Thread t = new Thread() {...}
t.start();
并在监听器中:
t.interrupt();
至于
// Thread.interrupted(); -> does not work
它将在从 Thread 派生的 class 中工作,并且与 this.interrupted()
相同; t.interrupted()
将在 class 定义之外工作。
另请注意,方法 isInterrupted()
does not clear the interruption flag, while interrupted()
具有清除标志的副作用 。
让线程成为一个 class 变量,而不是线程的匿名实现。假设线程的名字是 btnOneThread
private Thread btnOneThread;
在需要的地方初始化线程并启动它。
btnOneThread = new Thread( ){...}
btnOneThread.start();
点击button2时调用
if (btnOneThread != null) {
btnOneThread.interrupt();
}
我有一个按钮侦听器 包括一个线程睡眠和另一个按钮侦听器。
第二个按钮侦听器必须中断此线程,我不知道该怎么做:
我的代码:
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 侦听器中断线程?
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);}
}
}
通过调用 thread.interrupt() 方法。您还需要将 Thread 实例保存在 class.
的字段中Thread t = new Thread() {...}
t.start();
并在监听器中:
t.interrupt();
至于
// Thread.interrupted(); -> does not work
它将在从 Thread 派生的 class 中工作,并且与 this.interrupted()
相同; t.interrupted()
将在 class 定义之外工作。
另请注意,方法 isInterrupted()
does not clear the interruption flag, while interrupted()
具有清除标志的副作用 。
让线程成为一个 class 变量,而不是线程的匿名实现。假设线程的名字是 btnOneThread
private Thread btnOneThread;
在需要的地方初始化线程并启动它。
btnOneThread = new Thread( ){...}
btnOneThread.start();
点击button2时调用
if (btnOneThread != null) {
btnOneThread.interrupt();
}