ThreadFactory:就像一个代理类。在创建一个线程的时候,通过实现ThreadFactory接口的类对象,就会监听到它,从而执行ThreadFactory的newThread(Runnable r)方法。把该线程传人方法中,你就可以在方法中对线程进行一些操作(如,给线程起名字,把线程封装到那个组,修改线程的优先级等等。)最后会把包装过的线程,放入jvm中去执行。
首先来构建线程封装类WorkThread,该类的功能主要是为了能够更好的管理线程而创建的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public
class
WorkThread
extends
Thread {
private
Runnable target;
//线程执行目标
private
AtomicInteger counter;
public
WorkThread(Runnable target, AtomicInteger counter) {
this
.target = target;
this
.counter = counter;
}
@Override
public
void
run() {
try
{
target.run();
}
finally
{
int
c = counter.getAndDecrement();
System.out.println(
"terminate no "
+ c +
" Threads"
);
}
}
}
|
其次,来定义一个测试目标
1
2
3
4
5
6
7
8
|
public
class
WorkRunnable
implements
Runnable
{
@Override
public
void
run() {
System.out.println(
"complete a task"
);
}
}
|
实现线程工厂的方法
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public
class
WorkThreadFactory
implements
ThreadFactory{
private
AtomicInteger atomicInteger =
new
AtomicInteger(
0
);
@Override
public
Thread newThread(Runnable r)
{
int
c = atomicInteger.incrementAndGet();
System.out.println(
"create no "
+ c +
" Threads"
);
return
new
WorkThread(r, atomicInteger);
//通过计数器,可以更好的管理线程
}
}
|
测试线程工厂
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
public
class
TestThreadFactory {
public
static
void
main(String[] args) {
//创建线程(并发)池,自动伸缩(自动条件线程池大小)
ExecutorService es = Executors.newCachedThreadPool(
new
WorkThreadFactory());
//同时并发5个工作线程
es.execute(
new
WorkRunnable());
es.execute(
new
WorkRunnable());
es.execute(
new
WorkRunnable());
es.execute(
new
WorkRunnable());
es.execute(
new
WorkRunnable());
//指示当所有线程执行完毕后关闭线程池和工作线程,如果不调用此方法,jvm不会自动关闭
es.shutdown();
try
{
//等待线程执行完毕,不能超过2*60秒,配合shutDown
es.awaitTermination(
2
*
60
, TimeUnit.SECONDS);
}
catch
(InterruptedException e) {
e.printStackTrace();
}
}
}
|
线程工厂是一个接口,它用于根据需要创建新线程的对象。使用线程工厂就无需再手工编写对new Thread的调用了,从而允许应用程序使用特殊的线程子类、属性等等。
(相当于创建好了线程,分好了组,要用线程就直接在组里,执行要执行的线程)
static class GameThreadFactory implements ThreadFactory { // static final AtomicInteger poolNumber = new AtomicInteger(1); final ThreadGroup group; final AtomicInteger threadNumber = new AtomicInteger(1); final String namePrefix; public GameThreadFactory(ExecutorType poolType) { SecurityManager s = System.getSecurityManager(); //获得系统安全接口 group = (s != null)? s.getThreadGroup() : //在接口中获得线程的分组 Thread.currentThread().getThreadGroup(); //获得当前线程所在组 namePrefix = "pool-" + poolType.toString()+ "-thread-"; } @Override 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; } }
ThreadPoolExecutor t = new ThreadPoolExecutor(1, 1,0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(),new GameThreadFactory(etype)); //把它配置到线程池中管理.
使用:
t.execute(new Runnable() { @Override public void run() { try{ hePlayers_UID_BINDING_AND_RESET_PWD_STATUS.put(pvo.getUid(),map); }
}
});