Java并发包学习一 ThreadFactory介绍
ThreadFactory翻译过来是线程工厂,顾名思义,就是用来创建线程的,它用到了工厂模式的思想。它通常和线程池一起使用,主要用来控制创建新线程时的一些行为,比如设置线程的优先级,名字等等。它是一个接口,接口中只有一个方法:
/*
*
*
*
*
*
* Written by Doug Lea with assistance from members of JCP JSR-166
* Expert Group and released to the public domain, as explained at
* http://creativecommons.org/publicdomain/zero/1.0/
*/ package java.util.concurrent; /**
* An object that creates new threads on demand. Using thread factories
* removes hardwiring of calls to {@link Thread#Thread(Runnable) new Thread},
* enabling applications to use special thread subclasses, priorities, etc.
*
* <p>
* The simplest implementation of this interface is just:
* <pre>
* class SimpleThreadFactory implements ThreadFactory {
* public Thread newThread(Runnable r) {
* return new Thread(r);
* }
* }
* </pre>
*
* The {@link Executors#defaultThreadFactory} method provides a more
* useful simple implementation, that sets the created thread context
* to known values before returning it.
* @since 1.5
* @author Doug Lea
*/
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);
}
下面定义MyThreadFactoryTest1类实现ThreadFactory接口的newThread方法:创建线程时候,为线程设置名字,代码如下:
package concurrentMy.ThreadFactory; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger; /**
*
* (类型功能说明描述)
*
* <p>
* 修改历史: <br>
* 修改日期 修改人员 版本 修改内容<br>
* -------------------------------------------------<br>
* 2016年3月15日 下午6:31:57 user 1.0 初始化创建<br>
* </p>
*
* @author Peng.Li
* @version 1.0
* @since JDK1.7
*/
public class MyThreadFactoryTest1 implements ThreadFactory { private final AtomicInteger count = new AtomicInteger(0); // private final String namePrefix = "jmsgPool-" + count.incrementAndGet() + "-" + "PersistenceWrite" + "-thread-"; @Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
t.setName("jmsgPool-" + count.incrementAndGet() + "-" + "PersistenceWrite" + "-thread");
System.out.println("Create new thread, thread name: " + t.getName());
return t;
} /**
*
* (测试)
*
* @param args
*/ public static void main(String[] args) {
ExecutorService service = Executors.newFixedThreadPool(5, new MyThreadFactoryTest1()); for (int i = 0; i <= 5; i++) {
service.submit(new Runnable() { @Override
public void run() {
System.out.println("Start execute...");
}
});
} }
}
Create new thread, thread name: jmsgPool-1-PersistenceWrite-thread
Create new thread, thread name: jmsgPool-2-PersistenceWrite-thread
Start execute...
Create new thread, thread name: jmsgPool-3-PersistenceWrite-thread
Start execute...
Create new thread, thread name: jmsgPool-4-PersistenceWrite-thread
Start execute...
Create new thread, thread name: jmsgPool-5-PersistenceWrite-thread
Start execute...
Start execute...
Start execute...
JDK中默认的ThreadFactory
在JDK的Executors类中有一个DefaultThreadFactory类,它实现了ThreadFactory,它是JDK中默认的线程工厂类,从源码可以看到这个线程工厂类为线程池中新创建的线程设置的名字为:
/**
* The default thread factory
*/
static class DefaultThreadFactory implements ThreadFactory {
private static final AtomicInteger poolNumber = new AtomicInteger(1);
private final ThreadGroup group;
private final AtomicInteger threadNumber = new AtomicInteger(1);
private final String namePrefix; DefaultThreadFactory() {
SecurityManager s = System.getSecurityManager();
group = (s != null) ? s.getThreadGroup() :
Thread.currentThread().getThreadGroup();
namePrefix = "pool-" +
poolNumber.getAndIncrement() +
"-thread-";
} public Thread newThread(Runnable r) {
Thread t = new Thread(group, r,
namePrefix + threadNumber.getAndIncrement(),
0);
if (t.isDaemon())
t.setDaemon(false);
if (t.getPriority() != Thread.NORM_PRIORITY)
t.setPriority(Thread.NORM_PRIORITY);
return t;
}
}
Java并发包学习一 ThreadFactory介绍的更多相关文章
- [Java并发包学习七]解密ThreadLocal
概述 相信读者在网上也看了非常多关于ThreadLocal的资料,非常多博客都这样说:ThreadLocal为解决多线程程序的并发问题提供了一种新的思路:ThreadLocal的目的是为了解决多线程訪 ...
- Java并发包学习--ReentrantLock
这个锁叫可重入锁.它其实语义上和synchronized差不多,但是添加了一些拓展的特性. A reentrant mutual exclusion Lock with the same basic ...
- [Java并发包学习八]深度剖析ConcurrentHashMap
转载自https://blog.csdn.net/WinWill2012/article/details/71626044 还记得大学快毕业的时候要准备找工作了,然后就看各种面试相关的书籍,还记得很多 ...
- JAVA并发包学习
1)CyclicBarrier一个同步辅助类,允许一组线程相互等待,直到这组线程都到达某个公共屏障点.该barrier在释放等待线程后可以重用,因此称为循环的barrier 2)CountDownLa ...
- java并发编程学习: ThreadLocal使用及原理
多线程应用中,如果希望一个变量隔离在某个线程内,即:该变量只能由某个线程本身可见,其它线程无法访问,那么ThreadLocal可以很方便的帮你做到这一点. 先来看一下示例: package yjmyz ...
- java并发包研究之-ConcurrentHashMap
概述 HashMap是非线程安全的,HashTable是线程安全的. 那个时候没怎么写Java代码,所以根本就没有听说过ConcurrentHashMap,只知道面试的时候就记住这句话就行了…至于为什 ...
- Java并发包下锁学习第一篇:介绍及学习安排
Java并发包下锁学习第一篇:介绍及学习安排 在Java并发编程中,实现锁的方式有两种,分别是:可以使用同步锁(synchronized关键字的锁),还有lock接口下的锁.从今天起,凯哥将带领大家一 ...
- Java并发包下锁学习第二篇Java并发基础框架-队列同步器介绍
Java并发包下锁学习第二篇队列同步器 还记得在第一篇文章中,讲到的locks包下的类结果图吗?如下图: 从图中,我们可以看到AbstractQueuedSynchronizer这个类很重要(在本 ...
- Java并发包源码学习之AQS框架(四)AbstractQueuedSynchronizer源码分析
经过前面几篇文章的铺垫,今天我们终于要看看AQS的庐山真面目了,建议第一次看AbstractQueuedSynchronizer 类源码的朋友可以先看下我前面几篇文章: <Java并发包源码学习 ...
随机推荐
- 纯css3开发的响应式设计动画菜单(支持ie8)
这是一个响应式设计的菜单.单击列表图标,当你显示屏大小可以完全水平放下所有菜单项时,菜单水平显示(如图1).当你的显示屏不能水平放置所有菜单项时,菜单垂直显示(如图2). 而且显示的时候是以动画的型式 ...
- 通过USB连接越狱iPhone,SSH进入设备
通过USB连接越狱iPhone,SSH进入设备html, body {overflow-x: initial !important;}.CodeMirror { height: auto; } .Co ...
- Python3 串口模块移植并使用。
想通过 Python去控制串口模块,直接上层就使用一门语言,这样虽然执行效率低一些,但是开发速度加快 通过 buildroot 先移植 Python-serial 模块 x Symbol: BR2_P ...
- Deepin Linux已经做得相当不错了
很庆幸,用了MacBook Pro三四年后,还会想要用Linux做桌面,一方面说明自己还是年轻的,保持着愿意折腾的心态:另一方面,也确实发现macOS的桌面环境并不如传说中的稳定和好用. Deepin ...
- PHP——大话PHP设计模式——PSR-0规范
- android——字符串string(转)
原文地址:http://www.open-open.com/lib/view/open1387942832078.html String : 字符串类型 一.构造函数 String(byte[ ...
- [数据结构]最小生成树算法Prim和Kruskal算法
最小生成树 在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树. 例如,对于如上图G4所示的连通网可以有多棵权值总 ...
- hbase源码系列(四)数据模型-表定义和列族定义的具体含义
hbase是一个KeyValue型的数据库,在<hbase实战>描述它的逻辑模型[行键,列族,列限定符,时间版本],物理模型是基于列族的.但实际情况是啥?还是上点代码吧. HTableDe ...
- Kryonet client disconnects after send a packet to server (java)
http://stackoverflow.com/questions/25934876/kryonet-client-disconnects-after-send-a-packet-to-server ...
- 微信小程序——template的循环嵌套
上一篇我们有写到 template的使用方法 .在实际运用中,需要做到template里面再嵌套一层循环.我们先看一下数据结构: 模板是用于循环list,现在的需求是在模板里面嵌套一个orderIte ...