如何通过按钮侦听器中断线程

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();
}