5. 线程池和Executor
如果线程之间的切换太过频繁也会消耗过多的资源,避免大量的线程切换可以保证提高任务完成的效率
如果线程自然阻塞如等待网络数据,没什么正常影响,但是如果是CPU受限,如果能避免大量线程切换可以提高效率。
java.util.concurent中的Executors类可非常容易的建立线程池。
只需要将各个任务做完一个Runnable对象通过submit提交给这个线程池,你就会得到一个Future对象,可以用来检查任务的进度。
例如:这里建立一个压缩文件的工程。
package thread;
import java.io.File;
import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class GZipAllFiles {
private static int THREAD_COUNT = 4;
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("E:\\tomcat\\webapps\\network\\bin\\thread\\test1.txt");
list.add("E:\\tomcat\\webapps\\network\\bin\\thread\\test2.txt");
list.add("E:\\tomcat\\webapps\\network\\bin\\thread\\test3.txt");
ExecutorService pool = Executors.newFixedThreadPool(THREAD_COUNT);
for (String filename : list) {
File f = new File(filename);
if(f.exists()){
if(f.isDirectory()){
File[] files = f.listFiles();
for (int i = 0; i < files.length; i++) {
if(!files[i].isDirectory()){
Runnable task = new GZipRunnable(files[i]);
pool.submit(task);
}
}
}else{
Runnable task = new GZipRunnable(f);
pool.submit(task);
}
}
}
}
}
package thread;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.GZIPOutputStream;
public class GZipRunnable implements Runnable {
private final File input;
public GZipRunnable(File input) {
this.input = input;
}
public void run() {
if(!input.getName().endsWith(".gz")){
File output = new File(input.getParent(),input.getName()+".gz");
if(!output.exists()){
try(
InputStream in =new BufferedInputStream(new FileInputStream(input));
OutputStream out = new BufferedOutputStream(new GZIPOutputStream(new FileOutputStream(output)));
){
int b;
while((b = in.read())!= -1) out.write(b);
out.flush();
}catch (Exception e) {
System.err.println(e);
}
}
}
}
}