Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 异步任务线程永不消亡_Android_Multithreading_Android Asynctask - Fatal编程技术网

Android 异步任务线程永不消亡

Android 异步任务线程永不消亡,android,multithreading,android-asynctask,Android,Multithreading,Android Asynctask,我正在使用AsyncTasks获取数据,以响应用户按下按钮。这可以很好地工作,并在获取数据时保持接口的响应性,但是当我检查Eclipse调试器中发生的事情时,我发现每次创建一个新的AsyncTask(这非常常见,因为它们只能使用一次),都会创建一个新线程,但从未终止 结果是大量的AsyncTask线程就在那里。我不确定这在实践中是否是一个问题,但我真的想去掉那些额外的线程 如何杀死这些线程?AsyncTask管理使用ThreadPoolExecutor创建的线程池。它将有5到128个线程。如果有

我正在使用
AsyncTask
s获取数据,以响应用户按下按钮。这可以很好地工作,并在获取数据时保持接口的响应性,但是当我检查Eclipse调试器中发生的事情时,我发现每次创建一个新的
AsyncTask
(这非常常见,因为它们只能使用一次),都会创建一个新线程,但从未终止

结果是大量的
AsyncTask
线程就在那里。我不确定这在实践中是否是一个问题,但我真的想去掉那些额外的线程


如何杀死这些线程?

AsyncTask
管理使用
ThreadPoolExecutor
创建的线程池。它将有5到128个线程。如果有5个以上的线程,那么这些额外的线程在被删除之前最多会停留10秒。(注意:这些数字是针对当前可见的开放源代码的,并且因Android版本而异)


请不要使用
异步任务
线程。

除了Commonware的响应:


目前我使用的是Android2.2,我的应用程序在任何时候都不会使用超过一个AsyncTask,但我每x分钟创建一个新的AsyncTask。开始时,新的AsyncTask线程开始出现(新AsyncTask的新线程),但在5个线程之后(如Commonware所述),它们只会在调试窗口中保持可见,并在需要新的AsyncTask线程时重新使用。它们只是停留在那里,直到调试器断开连接。

这里出现了相同的症状。在我的例子中,线程在我停止活动后挂起,我希望应用程序完全关闭。使用单线程执行器部分解决了问题:

    myActiveTask.executeOnExecutor(Executors.newSingleThreadExecutor());
这使得线程在完成其工作后消失。

使用

在将来的某个时候执行给定的任务。任务可以在新线程或现有池线程中执行

关于你的第二个问题:

我怎样才能杀死这些线程

使用
ThreadPoolExecutor
完成所有工作后,请按照以下帖子中的引用正确关闭它:


你说的“永不终止”是什么意思?任务是否从未结束其doInbackground方法,或者您只是在分配跟踪程序中看到asynctask对象?
doInbackground
方法完成,但线程继续显示在调试窗口中。例如:
线程[AsyncTask#4](正在运行)
感谢您的解释!我很高兴知道我没有做错任何事。出于好奇,为什么设计成这样?为什么不在所有方法返回后结束线程?大概是为了节省时间,在以后的请求中分叉线程。@Commonware我有一个服务,其中我正在运行一个异步任务来执行一些操作,该服务在按下小部件按钮时启动,当任务完成时,它必须立即停止服务,但是有时候我的任务不会死,所以你能告诉我怎么停止吗it@SreekanthKarumanaghat:使用
AsyncTask
处理需要这么长时间的任务通常是个坏主意。但是没有,我对额外线程消失的评论是当它们未使用时。因此,当您的6个任务中的一个任务结束时,它的线程将在池中停留10秒,然后该线程将终止。@SreekanthKarumanaghat:“我的问题是,并行运行20个(比如)异步任务是否有任何限制?”——今天大量使用
AsyncTask
并不是一个好计划。有20+个可能会运行10+秒,这类事情应该会让代码审查失败。如果快速连续创建20个任务,则一次只运行少数任务,其余任务将排队等待稍后执行。一次运行的内核数取决于CPU的内核数。好吧,目前的算法是2N+1并行线程,其中N是核心数。是的,确认:我看到的异步任务不超过5个。这个答案使异步任务在运行后消失了,也许这不是“谷歌的做事方式”,但它完成了任务。谢谢。这解决了我在单个线程上运行异步任务的具体问题。
BlockingQueue workQueue= new LinkedBlockingQueue<Runnable>(100); // Work pool size
ThreadPoolExecutor executor = new ThreadPoolExecutor(
            Runtime.getRuntime().availableProcessors(),       // Initial pool size
            Runtime.getRuntime().availableProcessors(),       // Max pool size
            1, // KEEP_ALIVE_TIME
            TimeUnit.SECONDS, //  KEEP_ALIVE_TIME_UNIT
            workQueue);
void execute (Runnable command)