/**
*
*/
package iotest.serversocket;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
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.List;
import java.util.zip.GZIPOutputStream;
/**
* @author Brandon B. Lin
*
*/
public class GZipThread extends Thread {
private List<File> jobQueue;
private static int filesCompressed = 0;
public GZipThread(List<File> jobQueue) {
this.jobQueue = jobQueue;
}
private static synchronized void incrementFilesCompressed() {
filesCompressed++;
}
@Override
public void run() {
while (filesCompressed != GZipAllFiles
.getNumbersOfFilesToBeCompressed()) { // if there is any job, even not in jobqueue
File input = getAJobFromQueue();
if(input == null) {
return;
} else {
incrementFilesCompressed();
compressedAnFile(input);
}
}
}
/**
* Get a job from queue if any , null if all job done
*/
private File getAJobFromQueue() {
File result = null;
synchronized (jobQueue) {
while (jobQueue.isEmpty()) {
if (filesCompressed == GZipAllFiles
.getNumbersOfFilesToBeCompressed()) {
System.out.println(Thread.currentThread() + " ending!");
return result;
}
try {
jobQueue.wait();
} catch (InterruptedException exception) {
exception.printStackTrace();
}
}
result = jobQueue.remove(jobQueue.size() - 1);
}
return result;
}
/**
* compress an file
*/
private void compressedAnFile(File fileToBeCompressed) {
if (!fileToBeCompressed.getName().endsWith(".gz")) { // 不压缩已经压缩的文件
try {
InputStream in = new BufferedInputStream(new FileInputStream(
fileToBeCompressed));
File output = new File(fileToBeCompressed.getParent(),
fileToBeCompressed.getName() + ".gz");
if (!output.exists()) { // 不重复压缩
OutputStream out = new BufferedOutputStream(
new GZIPOutputStream(new FileOutputStream(output)));
copyIntoOut(in, out);
}
} catch (IOException exception) {
exception.printStackTrace();
}
}
}
/**
* copy data from in to out
*/
private void copyIntoOut(InputStream in, OutputStream out)
throws IOException {
int readByte;
while ((readByte = in.read()) != -1) {
out.write(readByte);
}
out.flush();
out.close();
in.close();
}
}
/**
*
*/
package iotest.serversocket;
import java.io.File;
import java.util.Vector;
/**
* @author Brandon B. Lin
*
*/
public class GZipAllFiles {
public final static int THREAD_COUNT = 4;
private static int filesToBeCompressed = -1;
private static GZipThread[] threads = new GZipThread[THREAD_COUNT];
private static Vector<File> jobQueue = new Vector<>();
public static void main(String[] args) {
createThreadPool();
String directoryToBeCompressed = "F:\\java\\UML\\";
addFilesToJobQueue(directoryToBeCompressed);
notifyAllThreadNoMoreJobs();
}
/**
* create THREAD_COUNT threads in thread pool
*/
private static void createThreadPool() {
for (int i = 0; i < threads.length; i++) {
threads[i] = new GZipThread(jobQueue);
threads[i].start();
}
}
/**
* if parameter is an file, add the file to jobQueue,
* if parameter is an directory, add first level's uncompressed files to jobqueue
*/
private static void addFilesToJobQueue(String directory) {
File file = new File(directory);
int totalFiles = 0;
if (file.exists()) {
if (file.isDirectory()) {
totalFiles += addDirectoryToJobQueue(file);
} else {
addAnFileToJobQueue(file);
totalFiles++;
}
}
filesToBeCompressed = totalFiles; // 必须一次性增加
}
/**
* 添加目錄的第一級文檔到作業隊列
*/
private static int addDirectoryToJobQueue(File directory) {
File[] files = directory.listFiles();
int numberOfFiles = 0;
for (int j = 0; j < files.length; j++) {
if (!files[j].isDirectory()) {
addAnFileToJobQueue(files[j]);
numberOfFiles++;
}
}
return numberOfFiles;
}
/**
* add an file (not directory) to jobqueuqe
*/
private static void addAnFileToJobQueue(File fileToAdd) {
synchronized (jobQueue) {
jobQueue.add(0, fileToAdd);
jobQueue.notifyAll();
}
}
/**
* Notify all threads in thread pool that no more job will be added.
*/
private static void notifyAllThreadNoMoreJobs() {
for (int i = 0; i < threads.length; i++) {
threads[i].interrupt();
}
}
/**
* How many files need to be compressed
*/
public static int getNumbersOfFilesToBeCompressed() {
return filesToBeCompressed;
}
}
分享到:
相关推荐
Java 线程池例子 ThreadPoolExecutor Java 中的线程池是指一个容器,里面包含了多个线程,这些线程可以重复使用,以避免频繁创建和销毁线程的开销。ThreadPoolExecutor 是 Java 中一个非常重要的线程池实现类,它...
Java线程池是一种高效管理线程资源的技术,它允许开发者创建一组可重用的工作线程,从而避免频繁地创建和销毁线程带来的性能开销。线程池在Java中主要通过`java.util.concurrent`包中的`ExecutorService`接口及其...
线程池里的线程等待等待队列里的线程执行,等待队列里的等待线程池里的完成,相互等待
Java线程池是一种高效管理线程的技术,它可以帮助开发者更好地控制并发执行的线程数量,避免资源浪费,提高系统性能。在Java中,线程池是通过`java.util.concurrent`包中的`ExecutorService`接口及其实现类来实现的...
Java线程池是Java并发编程中的重要组成部分,它允许开发者管理多个线程并有效地调度任务。线程池通过ThreadPoolExecutor类实现,这是一个高度可配置的工具,能够根据具体需求定制线程的创建、管理和销毁策略。 ...
Java线程池与反射机制是Java编程中两个重要的概念,它们在实际开发中扮演着至关重要的角色。线程池能够有效地管理和控制并发执行的任务,而反射机制则允许我们在运行时动态地访问和修改类的信息。 首先,让我们深入...
### Java线程池详解 #### 引言 在现代计算机科学中,线程作为轻量级的进程,已经成为操作系统和应用程序提高并发性、优化资源利用的关键技术之一。线程池,作为线程管理的一种高级机制,更是现代软件工程中不可或...
【标题】"火山安卓编程线程池例子"主要聚焦于Android平台上的多线程编程,尤其是使用火山编程框架实现线程池的示例。在Android应用开发中,线程池是一种有效的管理并发任务的方式,它可以帮助优化系统资源的使用,...
Java线程池是一种高效管理线程资源的工具,它的出现是为了优化系统性能,尤其是在需要频繁创建和销毁线程的情况下。由于操作系统创建新线程需要进行内存分配、上下文切换等操作,这涉及到一定的开销。因此,使用...
请最好使用MyEclipse导入工程,或者直接把src中的java文件拷贝到其他工程也可以使用,对想理解线程池概念的同学有很好的帮助
线程池示例(包含自定义拒绝策略),演示了如何创建一个线程池,以及添加到队列的过程,先添加到工作线程,然后是缓存队列,最后是创建临时线程
Java的`java.util.concurrent`包提供了`ExecutorService`接口和相关的实现类,如`ThreadPoolExecutor`,用于构建和管理线程池。通过设置核心线程数、最大线程数、线程存活时间等参数,可以定制适合不同场景的线程池...
java 线程池 实现 例子,线程池实例
corePoolSize:核心池的大小,在创建了线程池后,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务,当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中; ...
java代码 ThreadPoolExecutor线程池并发测试例子如有误欢迎指正
线程池的例子代码通常包括以下几个部分: - 创建线程池:设置线程池的参数,如最小线程数、最大线程数、线程空闲时间等。 - 提交任务:将需要执行的任务(通常是Runnable或Callable对象)提交给线程池。 - 执行任务...
Java线程池工作队列饱和策略代码示例 Java线程池工作队列饱和策略是Java并发编程中的一种重要机制,用于处理线程池中工作队列的饱和问题。在本文中,我们将详细介绍Java线程池工作队列饱和策略的概念、原理和实现。...
Java8并行流中自定义线程池操作示例 Java8并行流中自定义线程池操作示例主要介绍了Java8并行流中自定义线程池操作,结合实例形式分析了并行流的相关概念、定义及自定义线程池的相关操作技巧。 1. 概览 Java8引入了...
Java线程池是Java语言中一个非常重要的特性,特别是在多线程编程中,它通过管理和控制线程的创建和执行,有效地提高了程序的性能和资源利用率。线程池的引入始于JDK 1.5,它引入了`java.util.concurrent`包,提供了`...
在Android开发中,Java线程池是一个至关重要的概念,它能有效地管理多个并发任务,提高应用性能并降低资源消耗。线程池通过复用已创建的线程来避免频繁创建和销毁线程带来的开销,从而提升系统效率。在本教程中,...