并发编程:自定义并发类:2、使用线程工厂来生成自定义线程(ThreadFactory)

本文介绍如何通过自定义线程工厂创建线程对象,并展示了一个简单的示例程序,包括线程工厂的实现、线程类的扩展及普通任务的执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

序言

一、主程序

二、自定义线程

三、线程工厂

四、普通任务

五、执行结果


序言

线程工厂的目标是可以创建统一的线程对象:

  1. 实现自定义的线程类
  2. 实现ThreadFactory接口,来实现工厂类
  3. 使用工厂来创建线程对象

一、主程序

package xyz.jangle.thread.test.n8_4.threadfactory;

/**
 * 8.4、实现线程工厂(ThreadFactory)
 * 
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2020年9月22日 下午5:19:57
 * 
 */
public class M {

	public static void main(String[] args) throws Exception {
		// 1、创建线程工厂
		var factory = new MyThreadFactory("jangle");
		// 2、创建普通任务
		var task = new MyTask();
		// 3、使用工厂创建线程
		Thread thread = factory.newThread(task);
		thread.start();
		thread.join();
		System.out.println("M: 线程信息:"+thread);
		System.out.println("M: 结束");

	}

}

二、自定义线程

package xyz.jangle.thread.test.n8_4.threadfactory;

import java.util.Date;

/**
 *  自定义的线程
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2020年9月22日 下午5:22:24
 * 
 */
public class MyThread extends Thread {

	private final Date creationDate;

	private Date startDate;

	private Date finishDate;

	public MyThread(Runnable r, String name) {
		super(r, name);
		creationDate = new Date();
	}

	@Override
	public void run() {
		setStartDate(new Date());
		super.run();
		setFinishDate(new Date());
	}

	public void setStartDate(Date startDate) {
		this.startDate = startDate;
	}

	public synchronized void setFinishDate(Date finishDate) {
		this.finishDate = finishDate;
	}

	public synchronized long getExecutionTime() {
		return finishDate.getTime() - startDate.getTime();
	}

	@Override
	public synchronized String toString() {
		StringBuffer buffer = new StringBuffer();
		buffer.append(getName());
		buffer.append(": ");
		buffer.append(" Create :");
		buffer.append(creationDate);
		buffer.append(": Running time : ");
		buffer.append(getExecutionTime());
		buffer.append(" Milliseconds.");
		return buffer.toString();
	}

}

三、线程工厂

package xyz.jangle.thread.test.n8_4.threadfactory;

import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger;

/**
 *  线程工厂
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2020年9月22日 下午5:41:43
 * 
 */
public class MyThreadFactory implements ThreadFactory {

	private AtomicInteger counter;

	private String prefix;

	public MyThreadFactory(String prefix) {
		super();
		this.prefix = prefix;
		counter = new AtomicInteger(1);
	}

	@Override
	public Thread newThread(Runnable r) {
		var t = new MyThread(r, prefix + "-" + counter.getAndIncrement());
		return t;
	}

}

四、普通任务

package xyz.jangle.thread.test.n8_4.threadfactory;

import java.util.concurrent.TimeUnit;

/**
 *  一个普通任务
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2020年9月22日 下午5:45:12
 * 
 */
public class MyTask implements Runnable {

	@Override
	public void run() {

		try {
			TimeUnit.SECONDS.sleep(2);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

	}

}

五、执行结果

M: 线程信息:jangle-1:  Create :Tue Sep 22 17:48:12 CST 2020: Running time : 2001 Milliseconds.
M: 结束

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值