Multithreading 使用线程将文件NAM存储到队列中

Multithreading 使用线程将文件NAM存储到队列中,multithreading,Multithreading,我有一个要求,我必须处理目录中的所有文件,因此为此,我考虑将该要求分为两组,第一部分是线程将文件放入队列(生产者),第二部分是线程从队列中读取文件并开始处理它们 我面临的问题是,只有一个线程正在执行将文件放入队列的所有任务,其余线程都发现队列为空 读者班 package com.src.deloitte.helper; import java.io.File; import java.util.Queue; import java.util.concurrent.ConcurrentLinke

我有一个要求,我必须处理目录中的所有文件,因此为此,我考虑将该要求分为两组,第一部分是线程将文件放入队列(生产者),第二部分是线程从队列中读取文件并开始处理它们

我面临的问题是,只有一个线程正在执行将文件放入队列的所有任务,其余线程都发现队列为空

读者班

package com.src.deloitte.helper;

import java.io.File;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
public class MyReader
{
   int[] threads;
   private long counter = 0;
   final Queue exploreList = new ConcurrentLinkedQueue();

   public MyReader(int arrayLen) {
         threads = new int[arrayLen];
    }

   public void count() {
     counter++;
    }

   public void done(int id, int counter) {
       threads[id] = counter;
    }


  public static void main(String[] args) 
  {
        MyReader me = new MyReader(5);
        me.scan("c:\\myDirectory");}

    void scan(String fileName)
    {
        File file = new File(fileName);
        exploreList.add(file);
       for(int i =0;i<threads.length;i++ )
       {
           FileExplorer explorer = new FileExplorer(i,this); 
           Thread t = new Thread(explorer);
           t.start();
       }
      }
    }
package com.src.deloitte.helper;
导入java.io.File;
导入java.util.Queue;
导入java.util.concurrent.ConcurrentLinkedQueue;
公共类MyReader
{
int[]线程;
专用长计数器=0;
final Queue exploreList=新的ConcurrentLinkedQueue();
公共MyReader(int arrayLen){
线程=新整数[arrayLen];
}
公众作废计数(){
计数器++;
}
公共无效完成(整数id,整数计数器){
线程[id]=计数器;
}
公共静态void main(字符串[]args)
{
MyReader me=新MyReader(5);
me.scan(“c:\\myDirectory”);}
无效扫描(字符串文件名)
{
文件=新文件(文件名);
exploreList.add(文件);

对于(int i=0;i,在扫描函数中,向队列中添加1个文件,然后所有使用者都开始,尝试从队列中删除一个项目,如果队列为空,则退出

<> >只有找到原始文件的线程将继续运行。而不是等待队列是空的,您可能会考虑等待直到实际完成(也许队列是空的,并且没有其他线程将添加到队列中的可能性)。
public class FileExplorer implements Runnable {

    public int counter = 0;
    public MyReader owner;
    private int id;

    public FileExplorer(int id, MyReader owner) {
        this.id = id;
        this.owner = owner;
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() +"Entering into the run method");
        while (!owner.exploreList.isEmpty()) {
                 try{
                File file = (File) owner.exploreList.remove();

                if (file.exists()) {

                    if (!file.isDirectory()) {
                        doThemagic(file);
                    } else {

                        // add the files to the queue
                        File[] arr = file.listFiles();
                        if (arr != null) {
                            for (int i = 0; i < arr.length; i++) {
                                owner.exploreList.add(arr[i]);
                            }
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
                // silent kill :)
            }

            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
             }


        owner.done(id, counter);
        System.out.println(Thread.currentThread().getName() +"   " + "total of files : " + counter);
    }

    private void doThemagic(File file) {
        System.out.println(file.toString());
        counter++;
    }
}