多線程壓縮

grape927 11年前發布 | 913 次閱讀 37924
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.zip.GZIPOutputStream;

class Setup {
    static BlockingQueue<File> queue = new ArrayBlockingQueue<File>(2);
    static Queue<File> fileQueue = new ConcurrentLinkedQueue<File>();
    final static String path = "D:/000_test/c";
    static AtomicInteger aInt = new AtomicInteger();

    public static void main(String[] args) {
        File file = new File(path);
        if (file.isDirectory()) {
            File[] files = file.listFiles();
            fileQueue.addAll(Arrays.asList(files));
        } else if (file.isFile()) {
            fileQueue.add(file);
        }
        Producer p = new Producer();
        Producer p1 = new Producer();
        FileTransfer c1 = new FileTransfer();
        new Thread(p).start();
        new Thread(p1).start();
        new Thread(c1).start();
    }

    static class Producer implements Runnable {
        Producer() {
        }

        public void run() {
            try {
                while (!fileQueue.isEmpty()) {
                    aInt.incrementAndGet();
                    queue.put(compress(fileQueue.poll()));
                }
                System.out.println("finish");
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
        }

        private File compress(File input) {
            InputStream in = null;
            OutputStream out = null;
            try {
                in = new FileInputStream(input);
                in = new BufferedInputStream(in);
                File output = new File(input.getParentFile().getParent(), input.getName() + ".gz");
                System.out.println("produce=" + Thread.currentThread().getName()+" compress1="+output.getAbsolutePath());
                if (!output.exists()) {
                    out = new FileOutputStream(output);
                    out = new GZIPOutputStream(out);
                    out = new BufferedOutputStream(out);
                    int b;
                    while ((b = in.read()) != -1) {
                        out.write(b);
                    }
                    out.flush();
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                close(out);
                close(in);
            }
            return input;
        }

        private void close(Closeable c) {
            if (c != null) {
                try {
                    c.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    static class FileTransfer implements Runnable {

        public void run() {
            while (true) {
                try {
                    consume(queue.take());
                    if(aInt.decrementAndGet() == 0 && fileQueue.isEmpty()){
                        System.out.println("break..");
                        break;
                    }
                } catch (InterruptedException ex) {
                }
            }
        }

        void consume(File x) {
            System.out.println("consume=" + Thread.currentThread().getName() + " ==>"+x.getAbsolutePath());
        }
    }
}
 本文由用戶 grape927 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!