2012-01-04 76 views
1

我正在尝试处理多个文件写入命令(单独文件)而不挂用户界面。多个文件写入线程

摆在上下文我的问题,设想以下

  1. 我主要的应用程序看起来像一个文件管理器。目前它有10个文件,每个文件大小约为5MB。 (不要担心这个列表如何工作等)

  2. 当我选择一个文件项目时,我希望它立即开始将文件复制/复制到SD卡上的另一个位置。通常,这应该会持续几秒钟

  3. 我希望能够选择第二或第一之后,第三等立即文件。在所有内容结束时,我选择的所有文件都将被复制。所以我可以在5秒内点击5个文件,但所有的复制操作都需要一分钟。

这时两个选项都来我的脑海:

首先是简单地把每个文件的文件写入命令在一个单独的线程。伪代码看起来像这样

Onclick 
    new Thread() 
     write file 

如果一切正常,可以有场景在那里我有10个线程同时运行,写入10个单独的文件。我想知道是否有人以前做过这件事,我应该寻找什么

第二种选择当然是,如果已经有一定的数据结构/已知的方法可以解决这个问题。某种挂起的队列系统在我添加请求时变大,但随着系统写入数据而变小。

+0

必须通过[多线程对性能(http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html)看看。更具体地说,**处理并发**部分。 – 2012-01-04 19:48:55

回答

1

我没有绝对的把握如何在SD卡的作品,但我可以告诉你,试着写在与单个硬盘并行是一个坏主意,因为与顺序写入相比,它实际上会降低性能。

您可能想尝试使用ExecutorService并使用不同的线程计数来衡量性能,但是恐怕最终必须使用单个线程实现一个队列,将排队的文件逐个写入。

+2

并行写入硬盘驱动器的原因是因为读/写头必须保持移动到不同的部分的驱动器。 SD卡没有移动部件(至少没有超过原子尺寸)。这并不是说并行写入SD卡不会减慢速度(我不知道这种或那种方式);只是如果他们这样做,这是一个与硬盘无关的理由。 – 2012-01-05 03:15:58

0

我会创建一个AsyncTask类,它只是将给定的文件复制过来。每次选择文件时,为所选文件创建该类的新实例。内置于Android for AsyncTask的线程管理平衡良好,应该很好地处理这种用例。使用内置的AsyncTask方法可以轻松提供进度和完成的反馈。

0

我想java.util.concurrent中的类是你所需要的;特别是Executors类创建一个ThreadPoolEecutor。它具有接受用户点击的尽可能多的任务的好处,但将线程数量限制为您指定的某个限制。 (产卵线程无限制可能是一个问题,放缓不仅对方,但用户界面也是如此。)

+0

对于一个SD卡,线程数量的最大限制是1. – 2012-01-04 20:05:41

+0

@MartinJames - 这可能是最好的,但我会建议分析而不是做出这样的假设。例如,Android从3.0开始支持多核处理器,并且谁知道,可能有SD卡(以及插入它们的设备)支持多个数据路径。 – 2012-01-04 22:09:09

+0

上面的@Tudor也提出,并行写入SD卡可能会违反直觉。就我个人而言,我还喜欢将事情保持在单个线程(在本例中为main +执行程序线程),而不是具有我无法跟踪的多个线程。 感谢您的输入,我将用ExecutorService.newSingleThreadExecutor()来试用它,看看它是怎么回事 – 2012-01-05 03:02:48