[英]Interrupting a thread from a method
我想用 interrupt() 方法中断一个线程,但是我遇到了无法解释的行为。
如代码所示,从MainActivity调用worker方法cancel()不能中断线程,调用workerThread.interrupt()可以。
如果工作人员自己调用 cancel() ,它就会中断。
除非当前线程自己中断,这总是被允许的,否则调用此线程的 checkAccess 方法,这可能会导致抛出 SecurityException。
我认为这可能是一个安全异常,导致 UIThread 试图中断 workerThread,但它没有被抛出。 如果,它也应该在调用 workerThread.interrupt() 时抛出?
工人.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");
}
}
主活动.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);
}
}
worker.cancel
在主线程中被调用。 因此,cancel 方法中的Thread.currentThread()
返回主线程,因此interrupt
方法由主线程调用。 在这种情况下,您不会中断工作线程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.