Markdown编辑器上线啦,终于等到你了!使用这个编辑器写了两篇,感觉还是不错的!不过还是有一些问题,慢慢熟悉吧!
执行器
构建一个新的线程是有一定的代价的,因为涉及到和操作系统的交互。如果程序中创建了大量的生命周期很短的线程,应该使用线程池(thread pool)。
另一个使用线程池的理由是减少并发线程的数目。线程数量太多会大大降低性能甚至会使虚拟机崩溃。如果有一个会创建许多线程的算法,应该使用一个线程数“固定的”线程池以限制并发线程的总数。
Executor类构建线程池的静态方法
方法 | 描述 |
---|---|
newCachedThreadPool | 必要时创建新线程,空闲线程会被保留60秒 |
newFixedThreadPool | 该池包含固定数量的线程;空闲线程会一直被保留 |
newSingleThreadExecutor | 只有一个线程的“池”,该线程顺序执行每一个提交的任务 |
newScheduledThreadPool | 用于预定执行而构建的固定线程池,替代java.util.Timer |
newSingleThreadScheduledExecutor | 用于预定执行而构建的单线程“池” |
线程池
newCachedThreadPool方法构建了一个线程池,对于每个任务,如果有空闲的线程可用,立即让它执行任务,如果没有可用的空闲线程,则创建一个新线程。
newFixedThreadPool方法构建一个具有固定大小的线程池。如果提交的任务数多于空闲的线程数,那么把得不到的服务的任务放置到队列中。当其他任务完成以后再运行它们。
newSingleThreadExecutor是一个退化了的大小为1的线程池:由一个线程执行提交的任务,一个接着一个。这三个方法返回实现了ExecutorService接口的ThreadPoolExecutor类的对象。
使用连接池:
- 调用Executors类中静态的方法newCachedThreadPool或newFixedThreadPool。
- 调用submit提交Runnable或Callable对象。
- 如果想要取消一个任务,或如果提交Callable对象,那就要保存好返回的Future对象。
- 当不在提交任何任务时,调用shutdown。
MacthCounter类:
/**
* @author xzzhao
*/
public class MacthCounter implements Callable<Integer> {
private final File directory;
private final String keyword;
private final ExecutorService pool;
private int count;
public MacthCounter(File directory, String keyword, ExecutorService pool) {
super();
this.directory = directory;
this