62,614
社区成员
发帖
与我相关
我的任务
分享
public class EnumTest {
public static void main(String[] args) {
for (EnumWithAttribute enumItem :EnumWithAttribute.values()) {
System.out.println(String.format("Enum name:%s, attribute1:%s, attribute2:%s, attribute3:%s ",
enumItem.name(),
enumItem.getAttribute1(),
enumItem.getAttribute2(),
enumItem.getAttribute3() ));
}
}
static enum EnumWithAttribute {
EnumUnit1("detail1", 1, 1L),
EnumUnit2("detail2", 2, 2L),
EnumUnit3("detail3", 3, 3L),
EnumUnit4("detail4", 4, 4L),
EnumUnit5("detail5", 5, 5L),
EnumUnit6("detail6", 6, 6L);
private String attribute1;
public String getAttribute1() {
return this.attribute1;
}
private int attribute2;
public int getAttribute2() {
return this.attribute2;
}
private long attribute3;
public long getAttribute3() {
return this.attribute3;
}
EnumWithAttribute(String attribute1, int attribute2, long attribute3) {
this.attribute1 = attribute1;
this.attribute2 = attribute2;
this.attribute3 = attribute3;
}
}
}
public enum EnumWithAttribute
{
[EnumUnit("detail1", 1, 1L)]
EnumUnit1,
[EnumUnit("detail2", 2, 2L)]
EnumUnit2,
[EnumUnit("detail3", 3, 3L)]
EnumUnit3,
[EnumUnit("detail4", 4, 4L)]
EnumUnit4,
[EnumUnit("detail5", 5, 5L)]
EnumUnit5,
[EnumUnit("detail6", 6, 6L)]
EnumUnit6
}
[AttributeUsageAttribute(AttributeTargets.Field, Inherited = true, AllowMultiple = false)]
public class EnumUnitAttribute : Attribute
{
public String attribute1;
public int attribute2;
public long attribute3;
public EnumUnitAttribute(String attribute1, int attribute2, long attribute3)
{
this.attribute1 = attribute1;
this.attribute2 = attribute2;
this.attribute3 = attribute3;
}
}
// 这边要说一下 c# 必须要需要设置 doneEvent,来通知是否完成任务。
// 而且必须在任务执行完毕后finally执行通知
public abstract class AbstractTask
{
/// <summary>
/// taskCallBack
/// </summary>
/// <param name="parameter"></param>
public void taskCallBack(Object parameter)
{
this.TaskResult = doTask();
}
/// <summary>
/// done Event handler
/// </summary>
private ManualResetEvent doneEvent;
public ManualResetEvent DoneEvent
{
get { return doneEvent; }
set { doneEvent = value; }
}
}
public class ThreadPoolManager
{
/// <summary>
/// 这边设置线程池的大小
/// </summary>
private int poolSize;
private ThreadPoolManager(int poolSize)
{
this.poolSize = poolSize;
System.Threading.ThreadPool.SetMaxThreads(this.poolSize, this.poolSize);
}
/// <summary>
/// 执行 IList<TaskParameter>
/// </summary>
/// <param name="taskParameters">task list</param>
/// <param name="methods">Delegate array</param>
/// <returns></returns>
private const int NUM_WAIT_HANDLES = 64; // the number of wait handles
public List<AbstractTask> startTask(IList<TaskParameter> taskParameters)
{
int taskSize = taskParameters.Count;
List<AbstractTask> tasks = new List<AbstractTask>();
if (taskSize == 0)
{
return tasks;
}
Queue<ManualResetEvent> events = new Queue<ManualResetEvent>(taskSize);
foreach (TaskParameter eachPara in taskParameters)
{
AbstractTask task = TaskManger.getTaskInstance(eachPara);
ManualResetEvent manualResetEvent = new ManualResetEvent(false);
events.Enqueue(manualResetEvent);
task.DoneEvent = manualResetEvent;
tasks.Add(task);
}
// task.taskCallBack 执行真正的任务
// c# 需要将任务一个一个的加入到tasks池中
foreach (AbstractTask task in tasks)
{
System.Threading.ThreadPool.QueueUserWorkItem(task.taskCallBack, null);
}
// 这边还有一个问题就是 等待任务的数量不能超过64,你说郁闷吗?
// 那只能批量64个任务 等待了。
// Wait for completion
// Due to limitations on WaitAll, must be "chunked" in sets of 64 or fewer wait handles
List<WaitHandle> handles = new List<WaitHandle>(NUM_WAIT_HANDLES);
// calculate the number of times that we need to wait
int loops = ((taskParameters.Count - 1) / NUM_WAIT_HANDLES) + 1;
//chuncking the waiting
for (int currentLoop = 0; currentLoop < loops; currentLoop++)
{
for (int handleCount = 0; handleCount < NUM_WAIT_HANDLES; handleCount++)
{
if (events.Count == 0)
{
break;
}
handles.Add(events.Dequeue());
}
WaitAll(handles.ToArray());
handles.Clear();
}
return tasks;
}
/// <summary>
/// Wait All done Event
/// </summary>
/// <param name="doneEvents"></param>
private void WaitAll(WaitHandle[] doneEvents)
{
// WaitAll for multiple handles on an STA thread is not supported.
// so wait on each handle individually.
if (Thread.CurrentThread.GetApartmentState() == ApartmentState.STA)
{
// using foreach,wait for each Thread
foreach (WaitHandle myWaitHandle in doneEvents)
{
WaitHandle.WaitAny(new WaitHandle[] { myWaitHandle });
}
}
else
{
WaitHandle.WaitAll(doneEvents);
}
}
public final class MutipThread {
public static void main(String[] args) {
List<Task> tasks = new ArrayList<Task>(task_num);
for (int index = 0; index < task_num; index++) {
tasks.add(new Task(....));
}
ExecutorService threadPoolService = null;
try {
threadPoolService = Executors.newFixedThreadPool(thread_num);
List<Future<Object>> futures = threadPoolService.invokeAll(downloadTasks);
for (Future<Object> future : futures) {
System.out.println(future.get());
}
} finally {
if (threadPoolService != null) {
threadPoolService.shutdown();
}
}
}
static class Task implements Callable<Object> {
public Object call() throws Exception {
// do something
}
}
}