在单个线程中对多个操作进行排队

时间:2013-01-25 06:16:46

标签: java android multithreading

我正在设计一个应用程序,我需要不时下载多个图像。但是,我希望每当我发送下载请求时,它应该排队到一个线程而不是产生多个线程。

如果您能为我提供详细的解决方案,我将非常感激。谢谢!

4 个答案:

答案 0 :(得分:1)

我会看一下Executors.newFixedThreadPool()方法。它创建一个线程池,它只会同时运行多个线程,就像你在函数中传递它一样多。如果您传递1,它将一次只运行一个线程,因此您的下载将按顺序进行,但是在“a”不同的线程上。

使用此方法创建ExecutorService后,您只需在其Runnable方法中传递Callable / submit(),即可执行该方法。你完成后别忘了shutdown()

答案 1 :(得分:1)

您可以创建自己的队列并将所有图像请求放在那里。使用android AsynkTask,但只在上一次完成后开始新任务(棘手的方式)。

或者创建一个执行者服务来顺序下载图像(艰难地,重新发明轮子)。

或者在github上找到任何ImageDownloader for android。有几个支持单线程下载。 This one is popular.(简单方法)

P.S。您可以按顺序执行android AsyncTask,但它在API 11 +中受支持。

答案 2 :(得分:0)

如果您正在设计一个活动,您可以使用AsyncTask,它使用执行程序处理线程并为您管理它们。如果您正在使用服务,只需在一个线程中逐个下载文件,请在一段时间不活动后或在错误次数之后执行中断并重新启动线程。

答案 3 :(得分:0)

Metova Android SDK有一个名为ThreadPoolWorker的类。它的工作方式与AsyncTask完全相同,但有一个构造函数,它接受一个ThreadPool对象作为参数,可以限制为一个线程。 ThreadPool对象可以在各种ThreadPoolWorker对象之间重用,每个TheadPoolWorker的{​​{1}}方法基本上按照它们的启动顺序执行。

这是一个简单的例子:

doInBackground