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

问题描述:

我有一个按钮侦听器女巫包括一个线程睡眠和另一个按钮侦听器。如何通过按钮侦听器中断一个线程

第二个按钮侦听器必须中断该线程,我不知道如何做到这一点:

我的代码:

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

+0

你尝试'了Thread.interrupt();'? – 2015-02-10 08:44:22

+0

是的,我尝试过,但正如Randev所说,不适用于anonymus – 2015-02-10 08:58:58

而不是一个匿名执行的线程,使线程变成一个类变量。假设线程的名称是btnOneThread

private Thread btnOneThread; 

在需要时初始化线程并启动它。

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

当BUTTON2点击呼叫

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

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实例保存在你的类的一个字段中。

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

和在收听:

t.interrupt(); 

至于

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

它将从线程派生的类中工作,并且将是相同的this.interrupted(); t.interrupted()将在类定义之外工作。

还要注意的是isInterrupted()不清除中断标志的方法,而interrupted()具有清热旗的副作用。