如何停止或销毁正在运行的Thread

时间:2012-03-16 12:40:52

标签: android

我有一个主题类,它在活动的onCreate中出现。

 class MyThread extends Thread
 {
      void run()
      {
           //My code which takes time.
      }
 }

 //-------------------------- To run the thread
 MyThread mThread = new MyThread();
 mThread.start();

在某些外部事件中,我需要停止/销毁当前正在运行的线程 然后我创建一个MyThread的新副本,并在新线程上调用start函数来运行它。

但是我无法销毁/停止之前运行的线程 是否有任何API可以破坏正在运行的线程。

5 个答案:

答案 0 :(得分:6)

你无法销毁......只有android会在需要时停止线程..你无法停止或销毁它......反而尝试这样..

class MyThread extends Thread
 {
  void run()
  {
 while(bool){
       //My code which takes time.
  }
 }
 }

// --------------------------运行线程

   MyThread mThread = new MyThread();
   mThread.start();

现在当你想要停止线程时......将bool值改为false

bool=false;

现在你的代码没有运行......你可以开始新的线程...

答案 1 :(得分:4)

Thread.interrupt()方法是停止正在运行的线程的可接受方式,但是一些实现细节在你身上:如果你的线程正在执行IO(或任何其他可以抛出InterruptedException),那么你有责任确保在停止线程之前关闭已打开的所有资源。

This page表明为什么早期版本的Java中存在的某些线程功能已被弃用,以及为什么Thread.destroy()从未实际实现过。

答案 2 :(得分:2)

你可以使用AsyncTask insted,因为它在android中被称为Painless Threading。实施后,您无需担心线程管理。

AsyncTask可以轻松处理,并且处理ui非常容易。

答案 3 :(得分:0)

您可以实现自己的stopThread方法,而不是使用Thread.interrupt()或任何其他可能引发异常的方法。为此,例如,您必须具有名称为“ keepRunning”的局部布尔变量。 如果您的工作代码中有一个for循环或while循环需要时间,则可以检查布尔值,如果为false,则中断循环,您的代码将不再运行。

class MyThread extends Thread
 {
      boolean keepRunning = true;
      
      void run()
      {
           //inside your for loop
           if (keepRunning) {
           //keep running code which      takes time.
           }
           
           else break;
      }
      
      void stopThread() {
      keepRunning = false;
      }
 }

 //To run the thread
 MyThread mThread = new MyThread();
 mThread.start();
 
 
 //To stop the thread
 mThread.stopThread();

停止线程后,可以再次将其初始化为mThread。

答案 4 :(得分:-1)

尝试这样的事情......

 class MyThread extends Thread
 {
      void run()
      {
           //My code which takes time.
      }
 }

 //-------------------------- To run the thread
 MyThread mThread = new MyThread();
 mThread.start();

// PERFORM ALL YOUR OPERATIONS HERE..
mThread.destroy();