在面向对象编程的世界中,工厂模式是最有用的设计模式。它是一个创造模式,还有它的目的是创建一个或几个类的对象的对象。
有了这个工厂,我们有这些优势来集中创建对象们:
- 更简单的改变了类的对象创建或者说创建这些对象的方式。
- 更简单的为了限制的资源限制了对象的创建。 例如, 我们只new一个此类型的对象。
- 更简单的生成创建对象的统计数据。
以上是我看到的官方的说明,以下是我通俗的理解:
1.有了这个ThreadFactory接口,我们就可以自定义线程工厂接口。这个接口只需要实现一个方法就是newThread,这个方法必须返回一个线程。线程 工厂就是通过这个方法进行初始化线程的。
2.以下是我写的一个demo,就是自定义一个线程工厂,观察一下每个线程跟线程工厂关系。还有我在我的线程工厂里自定义了一个方法就是threadDaemon这个我起名叫线程守护,作用是在我的main方法里面写了一个定时线程池去调用这个方法,监控我的线程是否挂了。挂了我就启动一个新的线程。
public class ThreadFactoryTest implements ThreadFactory{
private List<Thread> threadList;
private Executor executor;
public ThreadFactoryTest() {
threadList=new ArrayList<Thread>();
}
private int count=0;
//初始化线程工厂
@Override
public Thread newThread(Runnable runnable) {
Thread result=new Thread(runnable);
System.out.println("hello,我是"+count+++":"+Thread.currentThread().getName());
threadList.add(result);
return result;
}
public void threadDaemon(){
List<Thread> deadThreads=new ArrayList<Thread>();
for (Thread thread : threadList) {
if(!thread.isAlive()){
System.out.println(thread.getName());
deadThreads.add(thread);
}
}
threadList.removeAll(deadThreads);
for (Thread thread : deadThreads) {
if(!thread.isAlive()){
executor.execute(new Go());
}
}
}
public List<Thread> getThreadList() {
return threadList;
}
public void setThreadList(List<Thread> threadList) {
this.threadList = threadList;
}
public Executor getExecutor() {
return executor;
}
public void setExecutor(Executor executor) {
this.executor = executor;
}
}
public class ThreadFactoryMain {
private static ThreadFactoryTest threadFactory=new ThreadFactoryTest();
public static void main(String[] args) {
init();
}
private static void init(){
ScheduledExecutorService service=Executors.newSingleThreadScheduledExecutor();
Executor executor=Executors.newFixedThreadPool(10,threadFactory);
threadFactory.setExecutor(executor);
for (int i = 0; i < 10; i++) {
executor.execute(new Go());
}
System.out.println(threadFactory.getThreadList().size());
//启动定时任务监控线程
service.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
threadDaemon();
},5, 5, TimeUnit.SECONDS);
}
/**
* 监控线程是不是挂了,挂了就起来
*/
private static void threadDaemon(){
System.out.println("定时任务开始");
threadFactory.threadDaemon();
}
}