为指定任务分配线程数量执行

 工作线程工厂(使用线程池为每个任务分配不同的线程数量)


import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 工作线程工厂
 */
public class WorkThreadFactory {

	//默认任务名称
	public static final String DEFAULT_TASK_NAME = "default_task_name";

	//默认线程数量
	public static final int DEFAULT_THREAD_NUM = 5;

	// 创建一个可重用固定线程数的线程池
	private Map executorServiceMap = new ConcurrentHashMap();

	//获取线程工厂单例
	public static WorkThreadFactory getInstance() {
		return Singleton.instance;
	}
	
	private static class Singleton {
		static WorkThreadFactory instance;
		static {
			instance = new WorkThreadFactory();
			instance.init();
		}
		private Singleton(){}
	}

	/**
	 * 初始化默认任务线程池
	 */
	private void init(){
		executorServiceMap.put(DEFAULT_TASK_NAME, Executors.newFixedThreadPool(DEFAULT_THREAD_NUM));
	}

    /**
	 * 任务执行
	 * @param taskName 任务名称
	 * @param command 任务
	 * @param workThreadNum 工作线程数量
	 */
	public  void execute(String taskName, Runnable command,int workThreadNum) {
		ExecutorService executorService = null;
		if (executorServiceMap.containsKey(taskName)) {
			executorService = executorServiceMap.get(taskName);
		}else {
			executorService = Executors.newFixedThreadPool(workThreadNum);
			System.out.println("线程池数量"+workThreadNum);
			executorServiceMap.put(taskName,executorService);
		}
		executorService.execute(command);
		System.out.println("线程情况***********************"+executorService);
	}


	/**
	 * 销毁线程池
	 */
	public void destroy() {
		ExecutorService executorService = null;
		for (Map.Entry entry : executorServiceMap.entrySet()) {
			executorService = entry.getValue();
			if (!executorService.isShutdown()) {
				entry.getValue().shutdown();
			}
		}
	}
}

任务处理(任务的相关实现)

import lombok.extern.slf4j.Slf4j;

/**
 * @description 任务处理
 */
@Slf4j
public class TaskHandler implements Runnable{


    @Override
    public void run() {
        // do something
    }
}

任务制定线程数量提交执行(为任务分配指定数量的线程交由线程池处理)

    /**
	 * 任务执行
	 * @param taskName 任务名称
	 * @param command 任务
	 * @param workThreadNum 工作线程数量
	 */
WorkThreadFactory.getInstance().execute("任务名称",new TaskHandler(),5);

你可能感兴趣的:(Java,多线程,java)