现在我要使用线程进程,我有一个线程,我将通过增加计数来运行该线程几次。 如果我通过线程本能停止线程将停止所有处理线程。
这是我尝试过的:
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(); 会阻止空洞线程或当前。
我需要停止特定线程,如果需要停止整个线程。
答案 0 :(得分:1)
这将是我在此提供的替代解决方案。首先,我必须警告,使用线程计数是容易出错且危险的。由于某些并发问题,您可能会错过递减或递增变量。我将在此提供针对您上述问题的解决方案,以及针对您的问题的替代解决方案。
解决您的问题:
首先,在上面的示例中,当您调用startThread.interrupt()时,您只引用了一个线程,因此它将帮助您仅停止当时引用的一个线程。
其次我建议您添加对List的引用,特别是并发集合或Synchronized集合。您可以从此列表中迭代线程引用,并在想要标记中断时调用interrupt()。
前:
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();
}}
备选和首选解决方案:
创建一个包含您要使用的线程数的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();
}
在上面的示例中,您将创建一个线程池。
您可以在线了解有关Executors和Threadpool的更多信息,或者阅读一本书&#34; Java Concurrency in Practice&#34; ,对于Android&#34;高效的Android线程&#34;。我希望它有所帮助。谢谢。
执行人员的简短补习:
您可以使用以下链接快速了解Executors或其他并发实用程序。这为您提供了一个Concurrency Utilities的知识。注意:检查侧面导航栏以获取其他实用程序。