Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.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
创建用于将文件写入磁盘的多线程,Java_Java_Multithreading_Threadpool_Callable - Fatal编程技术网

创建用于将文件写入磁盘的多线程,Java

创建用于将文件写入磁盘的多线程,Java,java,multithreading,threadpool,callable,Java,Multithreading,Threadpool,Callable,我有一段代码,当对象放入LinkedBlockingQueue时,它会将对象作为一个对象写入磁盘 到目前为止,这是单线程的。我需要使它成为多线程的,因为内容正在写入磁盘上的不同文件。因此,独立地写入它们没有坏处 我不确定我是否可以在这里使用ThreadPool,因为我不知道对象何时将被放置在队列中!!现在,如果我决定拥有一个由5个线程组成的fixedThreadPool,那么如何在多个对象之间分配它呢 非常感谢您的任何建议。 这是我现有的代码。当我在队列中获得一个新对象时,我希望生成一个新线程。

我有一段代码,当对象放入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,它是队列中的对象。此集合还具有要写入光盘的文件名。如果两个对象具有相同的文件名,则必须写入光盘上的相同文件。如何确保两个线程没有写入同一个文件?因为它会破坏我的数据。如何根据文件名分配线程?