TaskExecutorPool.java

package eu.javaexperience.multithread;

import java.util.ArrayList;
import java.util.Collection;
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;

import eu.javaexperience.reflect.Mirror;

public class TaskExecutorPool implements Executor
{
	protected final Collection<RerunnableThread<Runnable>> execs = new ArrayList<>();
	
	protected RerunnableThread<Runnable> executorCreator()
	{
		RerunnableThread<Runnable> ret = new RerunnableThread<Runnable>()
		{
			@Override
			public void runThis(Runnable param) throws Throwable
			{
				param.run();
			}
		};
		try
		{
			ret.waitFree(1, TimeUnit.SECONDS);
		}
		catch (Exception e)
		{
			Mirror.propagateAnyway(e);
		}
		return ret;
	}
	
	public synchronized void execute(Runnable exec)
	{
		for(RerunnableThread<Runnable> e:execs)
		{
			if(e.tryRerun(exec))
			{
				return;
			}
		}
		
		RerunnableThread<Runnable> r = executorCreator();
		r.tryRerun(exec);
		execs.add(r);
	}

	public synchronized int getThreadsCount()
	{
		return execs.size();
	}
}