【发布时间】:2020-02-27 08:33:37
【问题描述】:
我想用 interrupt() 方法中断一个线程,但是我遇到了我无法解释的行为。
如代码所示,从 MainActivity 调用 worker 方法 cancel() 不能中断线程,而调用 workerThread.interrupt() 可以。
如果 worker 自己调用 cancel(),它就会中断。
除非当前线程正在中断自己,这总是允许的,否则调用该线程的 checkAccess 方法,这可能会导致抛出 SecurityException。
我认为这可能是一个安全异常,导致 UIThread 试图中断 workerThread,但它没有被抛出。如果调用workerThread.interrupt()时也应该抛出?
Worker.java
package com.example.threadapp;
public class Worker implements Runnable {
public void cancel() {
Log.d("Threading", "call Thread.currentThread().interrupt()");
try {
Thread.currentThread().interrupt();
} catch (SecurityException e) {
e.printStackTrace();
Log.d("Threading", "SecurityException while interrupting");
}
}
@Override
public void run() {
//
while(!Thread.currentThread().isInterrupted()) {
Log.d("Threading", "Worker alive");
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
Thread.currentThread().interrupt();
cancel();
}
//cancel(); //interrupts thread
//Thread.currentThread().interrupt(); //interrupts thread
}
//
Log.d("Threading", "Worker Thread closing");
}
}
MainActivity.java
public class MainActivity extends AppCompatActivity {
private Worker worker;
private Thread workerThread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
worker = new Worker();
workerThread = new Thread(worker);
workerThread.start();
(new Handler(Looper.getMainLooper())).postDelayed(new Runnable() {
@Override
public void run() {
Log.d("Threading", " call worker.cancel()");
worker.cancel(); //doesn't interrupt thread
//workerThread.interrupt(); //interrupts thread
}
}, 10000);
}
}
【问题讨论】:
标签: java android multithreading