Java ThreadFactory接口用法

根据需要创建新线程的对象。使用线程工厂就无需再手工编写对 new Thread 的调用了,从而允许应用程序使用特殊的线程子类、属性等等。

JDK中的介绍:

An object that creates new threads on demand. Using thread factories removes hardwiring of calls tonew Thread, enabling applications to use special thread subclasses, priorities, etc.

The simplest implementation of this interface is just:

class SimpleThreadFactory implements ThreadFactory {
  public Thread newThread(Runnable r) {
    return new Thread(r);
  }
}  

The Executors.defaultThreadFactory method provides a more useful simple implementation, that sets the created thread context to known values before returning it.

  /**
     * The default thread factory
     */
    static class DefaultThreadFactory implements ThreadFactory {
        static final AtomicInteger poolNumber = new AtomicInteger(1);
        final ThreadGroup group;
        final AtomicInteger threadNumber = new AtomicInteger(1);
        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;
        }
    }  

下面写一简单示例。

 

package com.test;  

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;  

class Task implements Runnable{
    int taskId;
    public Task(int taskId) {
        this.taskId=taskId;
    }  

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"--taskId: "+taskId);  

    }
}  

class DaemonThreadFactory implements ThreadFactory {
    @Override
    public Thread newThread(Runnable r) {
        Thread t=new Thread(r);
        t.setDaemon(true);
        return t;
    }  

}
public class ThreadFactoryTest {
    public static void main(String[] args) {
        ExecutorService exec=Executors.newFixedThreadPool(3,new DaemonThreadFactory());
        for(int i=0;i<3;i++) {
            exec.submit(new Task(i));
        }
        exec.shutdown();
    }
}  

输出如下:

Thread-0--taskId: 0
Thread-1--taskId: 1
Thread-2--taskId: 2

分析:

DaemonThreadFactory中覆写的newThread()方法与submit()方法的调用关系,也就是说DaemonThreadFactory是如何起作用的。

调试输出其调用关系:

也就是说,submit()时会调用DaemonThreadFactory类的newThread()方法来创建线程。

时间: 2024-10-07 13:26:55

Java ThreadFactory接口用法的相关文章

Java语言Socket接口用法详解

Socket接口用法详解   在Java中,基于TCP协议实现网络通信的类有两个,在客户端的Socket类和在服务器端的ServerSocket类,ServerSocket类的功能是建立一个Server,并通过accept()方法随时监听客户端的连接请求. 扩展: ServerSocket中常用的构造函数及方法 构造函数:ServerSocket(int port) 这是一个构造方法,用于在当前的服务器默认的IP地址上监听一个指定的端口,即在指定的IP和端口创建一个ServerSocket对象

Java Enumeration接口

Enumeration接口定义 Enumeration接口与Iterator接口用法比较 一. 1.Enumeration接口定义 public interface Enumeration<E>实现 Enumeration 接口的对象,它生成一系列元素,一次生成一个.连续调用 nextElement 方法将返回一系列的连续元素. 例如,要输出 Vector<E> v 的所有元素,可使用以下方法: for (Enumeration<E> e = v.elements();

java 线程基本用法

java中的多线程 一.      java 线程基本介绍 1.进程与线程的区别 进程是指一个内存中运行的应用程序,每个进程都有一块独立的内存空间,一个进程包含一到多个线程. 每个线程都有他所属的进程,每个线程也就是该进程的一条执行路径,线程之间是高频率快速轮换执行的,‘同时’执行只是给人的感觉. 2.Java当中线程一般有5中状态 创建状态:生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态. 就绪状态:当调用了线程的start方法,线程就进入就绪状态,调用start方法后线

java扫盲 接口 Enumeration

摘要: 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 记起2年前,高中生活最多的是老师的批评.谢谢! -泥沙砖瓦浆木匠 一.初识Enumeration 二.功能的使用 三.演示Enumeration接口的使用 一.初识Enumeration 当我写网络编程的时候,我发现了这个接口.很神奇的是以前都没用过,NetworkInterface.getNetworkInterfaces()返回的是Enumeration载体

Java Spring AOP用法

Spring AOP Java web 环境搭建 Java web 项目搭建 Java Spring IOC用法 spring提供了两个核心功能,一个是IoC(控制反转),另外一个便是Aop(面向切面编程),IoC有助于应用对象之间的解耦,AOP则可以实现横切关注点(如日志.安全.缓存和事务管理)与他们所影响的对象之间的解耦. 1.简介 AOP主要包含了通知.切点和连接点等术语,介绍如下 通知(Advice) 通知定义了切面是什么以及何时调用,何时调用包含以下几种 Before 在方法被调用之前

Java的接口及实例

Java的接口及实例 一.定义 Java接口(Interface),是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能). 接口定义的一般形式为: [访问控制符]interface <接口名> { 类型标识符final 符号常量名n = 常数: 返回值类型  方法名([参数列表]); - } 二.接口的特点 1.Java接口中的成员变量默认都是public,static,final类型的

(实用篇)php支付宝接口用法分析

本文实例讲述了php支付宝接口用法.分享给大家供大家参考.具体分析如下: 现在流行的网站支持平台,支付宝当仁不让的老大了,现在我们就来告诉你如何使用支付宝api来做第三方支付,把支付宝放到自己网站来, alipay_config.php配置程序如下: <?php */ //alipay_config.php 配置程序 $interfaceurl = "https://www.alipay.com/payto:"; $sitename = "网站名称"; $we

java中接口中成员的定义

java中的接口的作用是提供编程框架,它作为统一的规范让其他类进行扩展,是java中非常优秀的设计. 这娃用以下代码总结了java中接口可以定义的成员以及它们默认被修饰的关键字: //外部接口的访问修饰符只能是public或默认修饰符 ,并且它的成员只能用public访问修饰符修饰, 接口不能用final修饰 public interface A { //成员变量,默认用public static final 修饰 String name="ahei"; //成员方法,默认用publi

JAVA的continue用法

JAVA的continue用法: public class test{ public static void main(String [] args){  for(int i=0;i<=10;i++){   if(i%2!=0){    continue;      }   System.out.println(i);    } }} 其实很简单,continue就是中断本次循环开始下一次. 结合这段代码就是.当i是奇数时,不打印,直接结束循环,开始下一次. 还一个例子: //测试continu