我一个线程管理设计

package com.ggjy.gd;

import java.util.HashMap;
import java.util.Map;

public class DothingsAction {

	public static void main(String[] args) {
		
		Map<String, Object> taskMap = new HashMap<String, Object>();
		
		taskMap.put("task1", "1");
		taskMap.put("task2", "2");
		taskMap.put("task3", "3");
		taskMap.put("task4", "4");
		taskMap.put("task5", "5");
		
		// 科研项目的申报,这个项目具体要做什么事情
		WorkTeamProcess workTeamProcess = new WorkTeamProcess(taskMap);
		
		// 国家科学院有一项重大科研项目(workteamThread),
		// 需要上报国家(remoteteam),
		// 国家把把科研项目提上日程(scheduleCoutainer)
		
		// 国家只要提上日程,<[这项科研项目就要启动了]> 或迟或早,就等经费足够
		// 由国家监控线程检索经费什么时候足够
		RemoteTeamService remote = new RemoteTeamService();
		remote.addWorkTeamProcess(workTeamProcess);
	}
}


package com.ggjy.gd;

public class RemoteTeamService {

	ScheduleContainer sic = null;
	
	public RemoteTeamService() {
		sic = ScheduleContainer.getInstance();
	}
	
	// 国家把上报来的科研项目提上日程
	public String addWorkTeamProcess(WorkTeamProcess workTeamProcess) {
		return sic.addWorkTeamProcess(workTeamProcess);
	}
}

package com.ggjy.gd;

import java.io.Serializable;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;

public class ScheduleContainer implements Serializable {

	private static final long serialVersionUID = 1L;

	private static ScheduleContainer schedule = null;
	
	private static ConcurrentHashMap<Object, Object>  totalMap = new ConcurrentHashMap<Object, Object>();
	
	private static ConcurrentHashMap<Object, Object>  importCounteMap = new ConcurrentHashMap<Object, Object>();
	
	// 多線程計數器
	private static AtomicInteger impExpTaskCount = new AtomicInteger(0);
	// private static Integer impExpTaskCount = new Integer(0);
	
	private int maxCounter = 0;
	
	private MyMonitor myMonitor = null;
	
	private static Object lock = new Object(); 
	
	public static ScheduleContainer getInstance()
	{
	
		synchronized (lock) {
			if (schedule == null)
			{
				schedule = new ScheduleContainer();
			}
			
			return schedule;
		}
	}
	
	// 国家提上日程的东西【经费足马上启动, 经费不足就等足够再启动】
	public synchronized String addWorkTeamProcess(WorkTeamProcess workTeamProcess)
	{
		String result = "RUN_NOW";
		
		// 反馈申报组要其启动项目
		WorkTeamThread workTeamThread = new WorkTeamThread(workTeamProcess);
		
		this.maxCounter = 10;
		
		if (this.maxCounter > impExpTaskCount.get())
		{
			new Thread(workTeamThread).start();
		}
		else
		{
			// 国家经费预算组,监控经费是否足够[国家限制每年最多十个重大科研项目]
			result = "QUEUR_WAIT";
			MyMonitor.setExportThreadList(workTeamThread);
			
			// 如果監控線程停止了 就重啟下
			if (this.myMonitor == null || (!this.myMonitor.isRunning()))
			{
				this.myMonitor = new MyMonitor();
				this.myMonitor.start();
			}
			
			return result;
		}
		
		return result;
	}

	public void setTotal(String currentTime, long total)
	{
		this.totalMap.put(currentTime, total);
	}
	
	public long getTotal(String currentTime) {
		Object total =  totalMap.get(currentTime);
		
		if (null == total) {return 0L;};
		
		return 0L;
	}
	
	public static AtomicInteger getImpExpTaskCount() {
		return impExpTaskCount;
	}

	public static void setImpExpTaskCount(AtomicInteger impExpTaskCount) {
		ScheduleContainer.impExpTaskCount = impExpTaskCount;
	}


	public static void incrementImpExpTaskCount()
	{
		impExpTaskCount.incrementAndGet();
	}
	
	public static void decrementImpExpTaskCount()
	{
		impExpTaskCount.decrementAndGet();
	}
	
}

package com.ggjy.gd;

import java.util.ArrayList;
import java.util.List;

/**
 * 線程監視器;同樣是一個線程類
 * @author AlDeric
 */
public class MyMonitor extends Thread {

	private static List<WorkTeamThread> exprotThreadList = new ArrayList<WorkTeamThread>();
	
	private boolean stop;
	
	public boolean isRunning()
	{
		return !this.stop;
	}
	
	public void run()
	{
		int maxCounte = 10;
		while (!exprotThreadList.isEmpty()) // 如果線程任務不為空,則拿一個執行
		{
			try {
				Thread.sleep(5000L);
				if (ScheduleContainer.getImpExpTaskCount().get() < maxCounte)
				{
					WorkTeamThread exportThread =  exprotThreadList.get(0);
					new Thread(exportThread).start(); // 啟動業務線程
					exprotThreadList.remove(0); // 從管理線程集合中拿掉一個業務線程
				}
			}catch(Exception e)
			{
				
			}
			
			this.stop = true;
		}
	}
	
	public static void setExportThreadList(WorkTeamThread exportThread)
	{
		exprotThreadList.add(exportThread); // 添加一個線程
	}
}


package com.ggjy.gd;

public class WorkTeamThread extends Thread{

	private WorkTeamProcess workTeamProcess = null;
	
	public WorkTeamThread(WorkTeamProcess workTeamProcess) {
		this.workTeamProcess = workTeamProcess;
	}

	// 经费下来了,通知科研组开工搞科研
	public void run()
	{
		try{
			ScheduleContainer.incrementImpExpTaskCount();
			this.workTeamProcess.startTask();
		}
		catch(Exception e)
		{
			
		}
		finally
		{
			ScheduleContainer.decrementImpExpTaskCount();
		}
	}
}


package com.ggjy.gd;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

/**
 * 業務類
 * @author AlDeric
 */
public class WorkTeamProcess implements Serializable{

	private static final long serialVersionUID = 1L;

	protected ScheduleContainer scheduleContainer = null;
	
	protected long taskCount;
	
	// 全局变量
	private Map<String, Object> taskMap = new HashMap<String, Object>();
	
	// 構造函數
	public WorkTeamProcess(Map<String, Object> taskMap)
	{
		this.taskMap = taskMap;
		this.scheduleContainer = ScheduleContainer.getInstance();
	}
	
	// 申报组获得经费,启动科研项目,下面的科研工作者开工啦
	public void startTask() {
		String exportType = String.valueOf(this.taskMap.get("task1"));
		
		if ("1".equals(exportType))
		{
			doBizMethod();
		}
	}

	// 具體要做的事情是什麼
	private void doBizMethod() {
		
		System.out.print("我只是一顆棋子,上面任務下來了,我要去做事了 ......");
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值