【java多線程】線程池之GZipThread

package com.thread.gzip;

import java.io.*;
import java.util.*;

public class GZipAllFiles {

	public final static int THREAD_COUNT = 4;
	private static int filesToBeCompressed = -1;

	public static void main(String[] args) {   

		Vector pool = new Vector();
		GZipThread[] threads = new GZipThread[THREAD_COUNT];

		for (int i = 0; i < threads.length; i++) {
			threads[i] = new GZipThread(pool);
			threads[i].start();
		}

		args  =  new String[]{"E:/test/other"}; 
		
		int totalFiles = 0;
		for (int i = 0; i < args.length; i++) {
			File f = new File(args[i]);
			if (f.exists()) {
				if (f.isDirectory()) {
					File[] files = f.listFiles();
					for (int j = 0; j < files.length; j++) {
						if (!files[j].isDirectory()) { // don't recurse directories
							totalFiles++;
							synchronized (pool) {
								pool.add(0, files[j]);
								pool.notifyAll();
							}
						}
					}
				} else {
					totalFiles++;
					synchronized (pool) {
						pool.add(0, f);
						pool.notifyAll();
					}
				}
			} // end if
		} // end for
		filesToBeCompressed = totalFiles;
		// make sure that any waiting thread knows that no
		// more files will be added to the pool
		for (int i = 0; i < threads.length; i++) {
			threads[i].interrupt();
		}

	}

	public static int getNumberOfFilesToBeCompressed() {
		return filesToBeCompressed;
	}

}

package com.thread.gzip;

import java.io.*;
import java.util.*;
import java.util.zip.*;

public class GZipThread extends Thread {    
	private List pool;
	private static int filesCompressed = 0;

	public GZipThread(List pool) {
		this.pool = pool;
	}
	private static synchronized void incrementFilesCompressed() {
		filesCompressed++;
	}
	public void run() {
		while (filesCompressed != GZipAllFiles.getNumberOfFilesToBeCompressed()) {
			File input = null;
			synchronized (pool) {
				while (pool.isEmpty()) {
					if (filesCompressed == GZipAllFiles.getNumberOfFilesToBeCompressed()) {
						System.out.println("Thread ending");
						return;
					}
					try {
						pool.wait();
					} catch (InterruptedException ex) {
					}
				}
				input = (File) pool.remove(pool.size() - 1);
				incrementFilesCompressed();
			}
			// don't compress an already compressed file
			if (!input.getName().endsWith(".gz")) {
				try {
					InputStream in = new FileInputStream(input);
					in = new BufferedInputStream(in);

					File output = new File(input.getParent(), input.getName() + ".gz");
					if (!output.exists()) { // Don't overwrite an existing file
						OutputStream out = new FileOutputStream(output);
						out = new GZIPOutputStream(out);
						out = new BufferedOutputStream(out);
						int b;
						while ((b = in.read()) != -1)
							out.write(b);
						out.flush();
						out.close();
						in.close();
					}
				} catch (IOException ex) {
					System.err.println(ex);
				}

			} // end if

		} // end while

	} // end run

} // end ZipThread
相關文章
相關標籤/搜索