同步关键字

时间:2012-10-25 11:39:17

标签: java android multithreading

我正在开发一个下载图片并将其保存到SD卡的应用程序。与sdcard交互的类看起来像这样......

public class SDCardImageManagerImp implements SDCardImageManager {

    private Context context;

    @Inject
    public SDCardImageManagerImp(Context context) {
        this.context = context;
    }

    @Override
    public void saveToSDCard(String id, Bitmap bitmap) throws FileNotFoundException {
        FileOutputStream outputStream = context.openFileOutput(id, Context.MODE_PRIVATE);
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
    }

    @Override
    public Bitmap getImage(String id) throws FileNotFoundException {
        return BitmapFactory.decodeStream(context.openFileInput(id));
    }

    @Override
    public void deleteImage(String id) {
        context.deleteFile(id);
    }

}

这个类是单例,因为我读到写入多个线程的磁盘可能会影响性能。但是,我确实有多个线程下载数据并将其发送到此类。所以我的问题是,如果这个类中的所有方法都具有同步键,那么它们是什么?

2 个答案:

答案 0 :(得分:2)

为什么不使用writerThreadPool = Executors.newFixedThreadPool(numThreads)创建图像编写器的线程池。这样,您可以调用writerThreadPool.submit(),以便在线程可用时将图像排队等待写入。线程池将为您处理io限制,因为它只允许您创建的给定数量的线程。通过使用Executors.newFixedThreadPool,您可以通过更改numThreads轻松播放线程数,以允许更多或更少的线程获得所需的性能。

答案 1 :(得分:1)

我不知道假设是否有效(你应该限制SD卡的I / O),但即使它是,你可能想让这个可配置,synchronized关键字不会让你。

如何计算Semaphore(以及设置许可证数量的配置文件)?