我们可以在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);
    }
}

相关内容

  • 没有找到相关文章

最新更新