gpt4 book ai didi

java - 我们可以在 java 中使用多线程概念和 WatchService API 吗?

转载 作者:太空宇宙 更新时间:2023-11-04 11:51:19 26 4
gpt4 key购买 nike

假设我有一个目录,我将在其中将多个传入文件放入该目录中。我需要根据文件创建时间处理所有文件,即需要首先处理第一个创建的文件。

为了观看目录,我实现了WatchService API。

如何根据创建日期对目录中的文件进行排序?我们可以在这里实现多线程概念吗?

最佳答案

确实只是一个骨架,但它应该可以帮助您开始。它将编译,但不会执行任何操作。

当您看到新文件进入时,将其添加到队列末尾。执行程序服务创建了 4 个线程等待处理文件。一旦其中之一进入,一个线程就会拾取它并开始处理。如果它们都很忙,则下一个文件将不得不等待,但仍会按照它们进入的顺序进行处理。

我不确定 sleep 是否是一个好主意。我想这取决于您收到文件的频率。

import java.io.File;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class FileWatcher //implements WatchService
{
private class FileProcessor implements Runnable
{
@Override
public void run()
{
while(!Thread.currentThread().isInterrupted())
{
try
{
File file = fileQueue.take(); // blocks
process(file);
}
catch (InterruptedException ex)
{
ex.printStackTrace();
}
// maybe sleep for a bit here (exponential backoff?)
}
}

private void process(File file)
{
// do some stuff
}
}

private static final int NUM_THREADS = 4;
private static final int QUEUE_SIZE = 1000;

private final BlockingQueue<File> fileQueue = new ArrayBlockingQueue<>(QUEUE_SIZE);

public FileWatcher()
{
// Create our 4 processors
ExecutorService executorService = Executors.newFixedThreadPool(NUM_THREADS);

for(int i = 0; i < NUM_THREADS; ++i)
{
executorService.execute(new FileProcessor());
}
}

// When a file comes in to your WatchService
private void onNewFile(File file)
{
fileQueue.add(file);
}
}

关于java - 我们可以在 java 中使用多线程概念和 WatchService API 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41805211/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com