1

2 つのタスクを個別に実行する必要があります。

最初のタスク

1 分に 1 回、特定のフォルダーにファイルがあるかどうかを確認する必要があります。存在する場合は、ファイルの名前をキューに追加する必要があります。

これは次のように行うことができます。

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);


    }

}

2 番目のタスク

キューが空の場合は、1 分間スリープするか、キューからファイルを 1 つずつ処理します。

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();

    }

}

ここで、両方を 1 つのクラスで同時に行う必要があります。それは可能ですか?

1 つのスレッドが 1 分に 1 回ファイルを取得する必要があります。別のスレッドがファイルを 1 つずつ実行する必要があります。ファイルがない場合は、1 分間待ってから再度チェックします。2 番目の方法では、無限ループを使用しました。その代わりに、物事を 1 つずつ実行できる方法はありますか?

4

2 に答える 2

3

Java ExecutorServiceでCallableを使用することを検討してください。これを使用して、タスクを簡単に分割し、同時に実行できるようにすることができます。それを超えて、いつでも結果を確認できる (または完了していない場合は延期できる) Future を取得できます。

「Concurrency in Practice」という Java と並行性に関する優れた本があります。

さらに、Java 7 には、ディレクトリでファイル リスナーを許可する新しい機能があります。これにより、この「チェック アンド ループ」機能を抽象化できる場合があります。

于 2012-10-19T21:33:37.783 に答える
1

キュー オブジェクトからファイルを取得するとき、およびファイルを追加するときに、キュー オブジェクトで同期します。

読み取るスレッドでwait()、キューが空の場合に呼び出します。
新しいファイルをチェックするスレッドでnotify()、新しいファイルをキューに追加した後に呼び出します。

これが通常のやり方です。


また、処理中のファイルをキューに追加しないようにする必要があります。

于 2012-10-19T21:33:14.740 に答える