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

时间:2015-02-10 08:36:02

标签: java android runnable thread-sleep interrupted-exception

我有一个按钮监听器,包括一个线程睡眠和另一个按钮监听器。

第二个按钮监听器必须中断此线程,我不知道如何执行此操作:

我的代码:

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监听器中断线程?

4 个答案:

答案 0 :(得分:1)

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

        }
    } 

答案 1 :(得分:0)

通过调用thread.interrupt()方法。您还需要将Thread实例保存在类的字段中。

答案 2 :(得分:0)

Thread t = new Thread() {...}
t.start();

并在听众中:

t.interrupt();

至于

//  Thread.interrupted(); -> does not work

它将从一个派生自Thread的类中起作用,并且与this.interrupted()相同; t.interrupted()将在类定义之外工作。

另请注意,方法isInterrupted()不会清除中断标记,而interrupted() 会产生清除标记的副作用

答案 3 :(得分:0)

而不是线程的匿名实现,使线程成为类变量。假设线程的名称是btnOneThread

private Thread btnOneThread;

在需要的地方初始化线程并启动它。

btnOneThread = new Thread( ){...}
btnOneThread.start();

单击按钮2时,请调用

if (btnOneThread != null) {
    btnOneThread.interrupt();
}