6

我想杀死一个特定的线程,但无法找到让它工作的方法。我接下来会包含所有信息,即使它看起来并不重要:

我使用动作栏 sherlock 并想在动作按钮事件上杀死一个线程。所以我有:

    Thread myThread;
    myThread = new Thread(new Runnable(){
        public void run(){
                functionX();
        }
      });
    myThread.start();

该线程是一个长时间运行的线程,并且 funcionX() 也创建了一些新线程。我想在以下情况下杀死线程:

   public boolean onOptionsItemSelected(MenuItem item){
    switch (item.getItemId()) {

    case android.R.id.home:
        myThread.interrupt();
        break;
    };

我已经尝试使用 ExecutorService,使用 submit(runnable) 作为 Future 结果和 Future.cancel 但似乎不起作用。我还应该提到 functionX() 使用 http get 请求从 JSON 服务获取数据。

4

3 回答 3

5

有多种方法可以做到这一点,其中几个可以像

  1. 而不是 Thread 使用 TimerTask 并调用 timeTask.cancel() - 用于中断
  2. 在线程的 run() 方法中,不断检查布尔值以确定线程是否应该终止,然后您可以调用中断或更好地抛出异常
于 2012-11-09T16:07:04.080 回答
0

来自rock_win的选项2是要走的路,你可以在这里看到为什么附上一些代码:

http://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html

于 2012-11-09T16:16:57.230 回答
0

自从提出这个问题以来已经有好几年了,但是如果有人需要,那么您可以使用您的线程对象,而不会出现任何问题thread.interrupt();。如果您不熟悉 Java 或 Java 中的线程并且想要停止线程而不更改很多内容或切换到不同的技术(如 timertask),那么这可以正常工作。

万一您需要再次启动线程,您需要重新初始化 Thread 对象才能这样做。所以,为了做到这一点,我简单地创建了一个实现 Runnable 的类,这样当我需要重新初始化线程对象时我不必输入太多。然后,每当我需要启动线程时,我都会调用

mythread = new Thread(new MyRunnable());  // initialize the thread
mythread.start();   // run the thread

然后当我需要停止它时,然后:

mythread.interrupt();  //stop the thread

当我需要再次启动线程时,我不得不再次这样做:

mythread = new Thread(new MyRunnable());  //re-initialize the thread
mythread.start();   // start the new thread
于 2021-02-12T12:32:37.657 回答