javamultithreadinglimit

How to make a thread limit in Java


Let's say I have 1000 files to read and because of some limits, I want to read maximum 5 files in parallel. And, as soon as one of them is finished, I want a new one starts.

I have a main function who have the list of the files and I try changing a counter whenever one thread is finished. but it doesn't works!

Any suggestion?

The following is the main function loop

for (final File filename : folder.listFiles()) {

    Object lock1 = new Object();
    new myThread(filename, lock1).start();
    counter++;
    while (counter > 5);
}

Solution

  • Spawning threads like this is not the way to go. Use an ExecutorService and specify the pool to be 5. Put all the files in something like a BlockingQueue or another thread-safe collection and all the executing ones can just poll() it at will.

    public class ThreadReader {
    
        public static void main(String[] args) {
            File f = null;//folder
            final BlockingQueue<File> queue = new ArrayBlockingQueue<File>(1000);
            for(File kid : f.listFiles()){
                queue.add(kid);
            }
    
            ExecutorService pool = Executors.newFixedThreadPool(5);
    
            for(int i = 1; i <= 5; i++){
                Runnable r = new Runnable(){
                    public void run() {
                        File workFile = null;
                        while((workFile = queue.poll()) != null){
                            //work on the file.
                        }
                    }
                };
                pool.execute(r);
            }
        }
    }