您的位置:首页 > 编程语言 > Java开发

Java 并发编程之线程池的使用 (三)

2014-09-07 22:00 961 查看

线程工厂

每当线程池需要创建一个线程时,都是通过线程工厂方法来完善的。默认的线程工厂方法将创建一个新的、非守护的线程,并且不包含特殊的配置信息,通过指定一个线程工厂方法,可以线程池的配置信息。

需要定制线程工厂方法的情景 :

需要为线程池里面的线程指定 个UncaughtExceptionHandler
实例化一个定制的Thread类执行调试信息的记录
需要修改线程的优先级或者守护线程的状态(这建设使用这两个功能,线程优先级会增加平台依赖性,并且导致活跃性问题,在大多数并发应用程序中,都可以使用默认的线程优先级)
只是希望给线程起个有意义的名字,用来解释线程的转储信息和错误日志
线程工厂只有一个抽象方法:

public interface ThreadFactory {

/**
* Constructs a new {@code Thread}.  Implementations may also initialize
* priority, name, daemon status, {@code ThreadGroup}, etc.
*
* @param r a runnable to be executed by new thread instance
* @return constructed thread, or {@code null} if the request to
*         create a thread is rejected
*/
Thread newThread(Runnable r);
}



上面的功能都在Thread类里面。

在调用构造函数后再定制ThreadPoolExecutor

在使用ThreadPoolExecutor的构造函数之后,仍然可以通过Set方法来配置线程池

ExecutorService exec = Executors.newCachedThreadPool();
if (exec instanceof ThreadPoolExecutor) {
((ThreadPoolExecutor) exec).setCorePoolSize(10);
} else
throw new AssertionError("bad assuption");

在Executors中包含一个unconfigurableExecutorService工厂方法。

如果我们不想创建出来的线程池被再次修改,可以用这个方法把它包装起来,变成“final"类型

Executors.unconfigurableExecutorService(executor);

扩展ThreadPoolExecutor

ThreadPoolExecutor是可扩展的,比如我们可以为线程添加统计信息,重载BeforeExecute和AfterExecute方法用于计时等操作

递归算法的并行化

其实很简单,对循环内的每个执行都用线程池来解决就好了

普通的串行递归

void processSequentially(List<Element> element) {
for (Element e : element) {
process(e);
}
}
递归并行化

void processInParallel(Executor exec, List<Element> element) {
for (final Element e : element) {
exec.execute(new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
process(e);
}
});
}
}

同时JDK也提供一个专门用于递归的并发计算框架fork-join,用于解决可以分解为固定的独立小问题。比如快递排序,我做过一个测试。当数据量达到10000的时候可以达到近三倍的计算速度
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 多线程 并发