【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


转载于:https://my.oschina.net/u/141132/blog/340177

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值