【问题标题】:Check that Files Execute Concurrently检查文件是否同时执行
【发布时间】:2012-10-19 21:12:29
【问题描述】:

我需要独立执行 2 项任务。

第一个任务

它应该每分钟检查一次特定文件夹中是否有任何文件。如果有,它应该将文件名添加到队列中。

这可以按如下方式完成:

import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;


public class schedulerExample extends Thread{

    public void checkFile()
    {
        System.out.println("checking whether file exist in folder");

    }

    public void getFiles()
    {
        System.out.println("getting the file names");
    }

    public void enqueueFiles()
    {
        System.out.println("add files to queue");
    }
    public static void main(String[] args) {

    final schedulerExample obj = new schedulerExample();
    ScheduledExecutorService executor = new ScheduledThreadPoolExecutor(1);
    executor.scheduleAtFixedRate(new Runnable() {

        @Override
        public void run() {

            obj.checkFile();
            obj.getFiles();
            obj.enqueueFiles();

        }
    }, 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);
                    if(size == 0)
                    {
                        try
                        {
                        Thread.sleep(60000);
                        }
                        catch(InterruptedException e)
                        {

                        }
                    }
                }

            }

        };

        t1.start();

    }

}

现在我需要在一个班级同时完成这两项工作。这可能吗?

一个线程应该每分钟提取一次文件。另一个线程应该一个接一个地执行文件。如果没有文件,它会等待一分钟并再次检查。在第二种方法中,我使用了无限循环——取而代之的是,有没有一种方法可以让我一个接一个地执行?

【问题讨论】:

  • 如果第一个文件还在处理中怎么办?
  • 类名应以大写字母开头;字段、方法参数和变量应以小写字母开头。这是 Java 的样式约定。

标签: java multithreading


【解决方案1】:

您可能需要考虑将 Callables 与 java ExecutorService 一起使用。这可用于轻松分解任务并允许它们同时运行。除此之外,您可以获得一个 Future ,它允许您随时检查结果(如果没有完成,则推迟)。

有一本关于 java 和并发的好书叫做“Concurrency in Practice”。

除此之外,Java 7 还具有允许在目录上进行文件侦听器的新功能。这可能允许您抽象出这种“检查和循环”功能。

【讨论】:

    【解决方案2】:

    当您从队列对象中获取文件以及向其中添加文件时,在队列对象上同步。

    在读取的线程中,如果队列为空,则调用wait()
    在检查新文件的线程中,在将新文件添加到队列后调用notify()

    这是通常的做法。


    您还应该防止将正在处理的文件添加到队列中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-15
      • 1970-01-01
      • 1970-01-01
      • 2013-04-21
      • 2016-07-11
      相关资源
      最近更新 更多