1
假設我有一個目錄,其中我將多個傳入文件放入該目錄。我需要根據創建的文件時間處理所有文件,即首先創建的文件需要先處理。我們可以在java中使用多線程概念和WatchService API嗎?
爲了觀看目錄,我實現了WatchService API。
我們如何根據創建的日期對目錄中的文件進行排序?我們可以在這裏實現多線程概念嗎?
假設我有一個目錄,其中我將多個傳入文件放入該目錄。我需要根據創建的文件時間處理所有文件,即首先創建的文件需要先處理。我們可以在java中使用多線程概念和WatchService API嗎?
爲了觀看目錄,我實現了WatchService API。
我們如何根據創建的日期對目錄中的文件進行排序?我們可以在這裏實現多線程概念嗎?
只是一個骨架,但它應該讓你開始。它會編譯但不會做任何事情。
當您看到新文件進來時,將其添加到隊列末尾。有執行者服務等待處理文件創建了4個線程。一旦它們中的一個進入,一個線程將把它拿起並開始處理。如果他們都很忙,下一個文件將不得不等待,但仍然會按照他們進來的順序處理。
我不確定睡眠是否是個好主意。我想這取決於你多久會有文件進來。
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);
}
}
多線程當然是可能的。說'File1'被創建,然後在'File2'之後不久,你關心'File2'是否在File1之前完成處理? (也許'File2'小得多) – Michael
不,我不關心File2的處理時間。你可以在這裏編輯示例代碼。 – dev777