1

我需要创建两个线程,一个调用调度程序执行器服务,另一个在无限循环中运行以获取和处理文件。

我使用以下代码:

ScheduledExecutorService executor = new ScheduledThreadPoolExecutor(1);
executor.scheduleAtFixedRate(new Runnable() {
        public void run()
        {
            obj.checkFileExist();
            obj.enqueue();

         }
    }, 0, 1, TimeUnit.MINUTES);

在一个无限循环中,我一个一个地处理文件:

public class processModel extends Thread{

    public static void getQueueSize(int size)
    {
        System.out.println("getting queue size");

    }
    public void dequeue()
    {

        // dequeue the queue
        System.out.println("dequeue");

    }

    public void processFile()
    {
        // process the file
        System.out.println("process file");
    }

    public static void main(String[] args) {
        final boolean flag = true;
        final int size = 9;
        final processModel obj = new processModel();
        Thread t1 = new Thread(){
            public void run()
            {
                while(flag)
                {
                obj.dequeue();
                obj.processFile();
                getQueueSize(size);

                }

            }

        };

        t1.start();

    }

}

我怎样才能同时实现两者?

  • 线程 1 - 检查文件夹中是否存在文件。如果是,则将其排入队列,否则休眠一分钟。-调度程序可以执行此操作
  • 线程 2 - 如果队列不为空,则一一处理。否则睡一分钟

如何同时运行这 2 个线程。如果您显示一些代码,它将对我有很大帮助。

4

3 回答 3

4

使用两个线程没有任何意义。两个线程同时运行的唯一时间是当入队者获取文件的速度快于出队者处理它们的速度时。如果你有一个重复的任务,你的解决方案会更简单,更健壮,这将确保你永远不会让一个线程总是领先于另一个线程(并且代码更简单)

ScheduledExecutorService executor = new SingleScheduledThreadPool();
executor.scheduleAtFixedRate(new Runnable() {
    public void run() {
        for(File file: obj.getCHangedFiles())
            obj.processFile(file);

     }
}, 0, 1, TimeUnit.MINUTES);
于 2012-10-20T08:55:53.863 回答
1

您至少有三个线程在运行(除了主线程):至少一个来自ExecutorService,processModelt1. 但原则上,您只需要一个。

我认为正在安排的工作也scheduleAtFixedRate(...)可以自己进行处理。毕竟,处理文件不会超过一分钟,不是吗?这样,您就大大降低了程序的复杂性。

但是,如果您坚持在不同的线程中进行检查和处理,我建议您使用JDK中的BlockingQueue实现之一。预定的任务会将文件t1或任何对象放入队列中,然后代码中的第二个线程可以获取并处理该对象。

于 2012-10-20T08:55:40.777 回答
0

我同意其他2个答案。如果你还用什么线程,你应该研究一下wait-notify机制。因为它比每分钟运行一个线程要高效得多。
*如果它是你第一次使用线程和并发 - 你不会在 5 分钟内得到它!获得它需要一些时间,所以请耐心等待。

编辑:如评论中所述 - 如果可能的话,最好使用现有的库。

于 2012-10-20T09:03:53.057 回答