ThreadFactory的理解

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);
	  }     }});

  


  

时间: 2024-10-12 05:26:03

ThreadFactory的理解的相关文章

学了忘忘了看之Java多线程

Java多线程 什么是线程? 线程是相对于进程而言的,通常在计算机中,一个程序就是一个进程,而一个进程中可以有一个或多个的进程来完成该程序相关的功能. 举个不是很恰当的例子:例如乐队表演是一个进程,那么主唱和鼓手和和声等都可以理解为一个线程,他们共同来完成演奏一首曲子的工作. 什么是线程的并行和并发? 并行:指的是在同一台机器上,多个CPU同时执行同一段功能代码来完成功能: 并发:指的是在同一台机器上,CPU利用调度算法,以超高的速度切换进程来执行同一段代码来完成功能(让人感觉和并行一样): 理

深入理解Java之线程池

原作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本文归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间. 那么有没有一种办法使得线程可

ThreadPoolExecutor的一点理解

整个ThreadPoolExecutor的任务处理有4步操作: 第一步,初始的poolSize < corePoolSize,提交的runnable任务,会直接做为new一个Thread的参数,立马执行 第二步,当提交的任务数超过了corePoolSize,就进入了第二步操作.会将当前的runable提交到一个block queue中 第三步,如果block queue是个有界队列,当队列满了之后就进入了第三步.如果poolSize < maximumPoolsize时,会尝试new 一个Th

ThreadPoolExecutor的理解思考

工作中多处接触到了ThreadPoolExecutor.趁着现在还算空,学习总结一下. 前记: jdk官方文档(javadoc)是学习的最好,最权威的参考. 文章分上中下.上篇中主要介绍ThreadPoolExecutor接受任务相关的两方面入参的意义和区别,池大小参数corePoolSize和maximumPoolSize,BlockingQueue选型(SynchronousQueue,LinkedBlockingQueue,ArrayBlockingQueue):中篇中主要聊聊与keepA

[转]深入理解Java之线程池

出处:http://www.cnblogs.com/dolphin0520/ 本文归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间. 那么有没有一种办法使得线程可以复用,就是执

深入理解OkHttp源码(一)——提交请求

本篇文章主要介绍OkHttp执行同步和异步请求的大体流程.主要流程如下图: 主要分析到getResponseWidthInterceptorChain方法,该方法为具体的根据请求获取响应部分,留着后面的博客再介绍. Dispatcher类 Dispatcher类负责异步任务的请求策略.首先看它的部分定义: public final class Dispatcher { private int maxRequests = 64; private int maxRequestsPerHost = 5

深入理解线程池(转)

原作者:海子 出处:http://www.cnblogs.com/dolphin0520/    在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间. 那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务? 在Java中可以通过线程池来达到这样的效果.今天我们就来详

线程小酌之理解线程池

一.引言 在学习JAVASE部分中,我们都学习到了基本的线程创建继承THREAD类或实现Runnable接口,在正常负载情况下,为每个任务分配一个线程这种方法能够提升串行执行的性能.只要请求的导弹速率不超出服务器的请求处理能力,那么这种方法可以同时带来更快的响应性和更高的吞吐率.但是在实际开发过程中,开发环境和测试环境因数据流量并没有达到实际请求流量,并不能发现实际的问题,在生产环境中,为每个任务分配一个线程这种方法存在一些缺陷,尤其是当需要创建大量的线程时: 1.线程的生命周期的开销非常高 线

教你写Http框架(二)——三个样例带你深入理解AsyncTask

这个标题大家不要奇怪,扯Http框架怎么扯到AsyncTask去了,有两个原因:首先是Http框架除了核心http理论外.其技术实现核心也是线程池 + 模板 + handler,而AsyncTask又正好也是这三者的完美结合.其次,也是自己在面试中发现大量的安卓开发人员全然不了解AsyncTask的原理和技术细节.而AsyncTask的思想在我们设计app框架和性能调优的时候是非常实用的.所以这里特地写一篇关于AsyncTask的博文. 老规矩,我的习惯还是通过写demo,把核心技术一点点剥离出