繁体   English   中英

从方法中断线程

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM