创建用于将文件写入磁盘的多线程,Java
我有一段代码,当对象放入LinkedBlockingQueue时,它会将对象作为一个对象写入磁盘 到目前为止,这是单线程的。我需要使它成为多线程的,因为内容正在写入磁盘上的不同文件。因此,独立地写入它们没有坏处 我不确定我是否可以在这里使用ThreadPool,因为我不知道对象何时将被放置在队列中!!现在,如果我决定拥有一个由5个线程组成的fixedThreadPool,那么如何在多个对象之间分配它呢 非常感谢您的任何建议。创建用于将文件写入磁盘的多线程,Java,java,multithreading,threadpool,callable,Java,Multithreading,Threadpool,Callable,我有一段代码,当对象放入LinkedBlockingQueue时,它会将对象作为一个对象写入磁盘 到目前为止,这是单线程的。我需要使它成为多线程的,因为内容正在写入磁盘上的不同文件。因此,独立地写入它们没有坏处 我不确定我是否可以在这里使用ThreadPool,因为我不知道对象何时将被放置在队列中!!现在,如果我决定拥有一个由5个线程组成的fixedThreadPool,那么如何在多个对象之间分配它呢 非常感谢您的任何建议。 这是我现有的代码。当我在队列中获得一个新对象时,我希望生成一个新线程。
这是我现有的代码。当我在队列中获得一个新对象时,我希望生成一个新线程。一般来说,如果您的文件位于同一物理设备上,您将无法获得性能优势,因为存储设备在读/写操作上同步工作。因此,您的线程将在I/O上被阻塞,这可能会导致速度降低,并且肯定会浪费可能会做有用工作的线程。一般来说,如果您的文件位于同一物理设备上,您将无法获得性能好处,因为存储设备在读/写操作上同步工作。因此,您的线程在I/O上会被阻塞,这可能会导致速度降低,并且肯定会浪费可能会做有用工作的线程。
如何在多个对象之间分配它?
嗯,您不必担心任务分配。您所需要做的就是提交一个可运行或可调用(描述您的任务)的线程,它将被交给池中的一个空闲线程,或者如果所有线程都在忙于处理,这个新任务将在队列中等待
下面是你可以尝试的
1) 创建一个最适合您需要的线程池
ExecutorService es = Executors.newFixedThreadPool(desiredNoOfThreads);
2) 由于您已经准备好了队列-
while (true) {
//peek or poll the queue and check for non null value
//if not null then create a runnable or callable and submit
//it to the ExecutorService
}
如何在多个对象之间分配它?
嗯,您不必担心任务分配。您所需要做的就是提交一个可运行或可调用(描述您的任务)的线程,它将被交给池中的一个空闲线程,或者如果所有线程都在忙于处理,这个新任务将在队列中等待
下面是你可以尝试的
1) 创建一个最适合您需要的线程池
ExecutorService es = Executors.newFixedThreadPool(desiredNoOfThreads);
2) 由于您已经准备好了队列-
while (true) {
//peek or poll the queue and check for non null value
//if not null then create a runnable or callable and submit
//it to the ExecutorService
}
谢谢@Tirath的回答。我非常确信。只有一个疑问。如果我有多个线程监听同一个队列,它不会产生任何问题吗?两个线程可能会同时拾取同一个对象!!这是由ThreadPool处理的吗?Threadpool是否保证只有1个线程可以访问队列上的1个对象???
LinkedBlockingQueue
是线程安全类。因此,无需担心多个线程访问同一队列。一切都搞定了。我被另一个问题困住了。我创建了一个线程池,线程正在侦听LinkedBlockingQueue。现在,我有了cacheEntrySet,它是队列中的对象。此集合还具有要写入光盘的文件名。如果两个对象具有相同的文件名,则必须写入光盘上的相同文件。如何确保两个线程没有写入同一个文件?因为它会破坏我的数据。如何根据文件名分配线程?谢谢@Tirath的回答。我非常确信。只有一个疑问。如果我有多个线程监听同一个队列,它不会产生任何问题吗?两个线程可能会同时拾取同一个对象!!这是由ThreadPool处理的吗?Threadpool是否保证只有1个线程可以访问队列上的1个对象???LinkedBlockingQueue
是线程安全类。因此,无需担心多个线程访问同一队列。一切都搞定了。我被另一个问题困住了。我创建了一个线程池,线程正在侦听LinkedBlockingQueue。现在,我有了cacheEntrySet,它是队列中的对象。此集合还具有要写入光盘的文件名。如果两个对象具有相同的文件名,则必须写入光盘上的相同文件。如何确保两个线程没有写入同一个文件?因为它会破坏我的数据。如何根据文件名分配线程?