如何在android中停止多个线程

时间:2016-01-29 09:10:40

标签: android multithreading

现在我要使用线程进程,我有一个线程,我将通过增加计数来运行该线程几次。 如果我通过线程本能停止线程将停止所有处理线程。

这是我尝试过的:

      if (null != image && server.threadCount <=10) {
            startThread = new Thread(mThread);
            startThread.start();

        }
        else
        {
            server.threadCount--;
        }
    }


    public static class RunnableThread implements Runnable {

        public void run() {
            server.threadCount++;
        /*    if (server.threadCount <=10) {
        Log.v("count",String.valueOf(server.threadCount));
                server.threadCount++;
            } */
        }
    }
}

如果我使用 startThread.interrupt(); 会阻止空洞线程或当前。

我需要停止特定线程,如果需要停止整个线程。

1 个答案:

答案 0 :(得分:1)

这将是我在此提供的替代解决方案。首先,我必须警告,使用线程计数是容易出错且危险的。由于某些并发问题,您可能会错过递减或递增变量。我将在此提供针对您上述问题的解决方案,以及针对您的问题的替代解决方案。

解决您的问题:

  1. 首先,在上面的示例中,当您调用startThread.interrupt()时,您只引用了一个线程,因此它将帮助您仅停止当时引用的一个线程。

  2. 其次我建议您添加对List的引用,特别是并发集合或Synchronized集合。您可以从此列表中迭代线程引用,并在想要标记中断时调用interrupt()。

  3. 前:

    List<Thread> threadList = 
        Collections.synchronizedList(new ArrayList<Thread>());
        ......
        startThread = new Thread(mThread);
             startThread.start();
        threadList.add(startThread);
        ......
        @Override
        public void onDestroy() {
        super.onDestroy();
    
        synchronized(threadList) {
       Iterator<String> iterator = threadList.iterator(); 
       while (iterator.hasNext())
          Thread startThread = iterator.next();
        startThread.interrupt();
       }}
    
    1. 根据Interrupted标志停止线程。
    2. 备选和首选解决方案:

      1. 创建一个包含您要使用的线程数的Threadpool。您可以调用shutdown()或shutdownNow()方法来实现上述操作。此调用会中断正在处理任务的线程。 例如:

        ExecutorService executer = Executors.newFixedThreadPool(10);
        executor.execute(YourRunnableHere); /*If you have 10 you can use a
                                       for loop to execute your runnables. */
        
        .......
        @Override
        public void onDestroy() {
        super.onDestroy();
        executor.shutdownNow();
        }
        
      2. 在上面的示例中,您将创建一个线程池。

        • 线程池是一个线程池。执行程序上提交或执行的任务由线程池中的线程处理。在上面创建一个包含10个线程的线程池。执行者可以并行执行10个任务。
        • 执行程序用于管理任务的执行。它们也用于中断线程。 这是上述例子的简短介绍。
      3. 您可以在线了解有关Executors和Threadpool的更多信息,或者阅读一本书&#34; Java Concurrency in Practice&#34; ,对于Android&#34;高效的Android线程&#34;。我希望它有所帮助。谢谢。

        执行人员的简短补习:

        您可以使用以下链接快速了解Executors或其他并发实用程序。这为您提供了一个Concurrency Utilities的知识。注意:检查侧面导航栏以获取其他实用程序。

        Short Tutorial on Executors