The problem here comes with the ThreadGroup. I want to have the number of all threads in the group and we mean absolute number not something like
myThreadGroup.activeCount()
that shows only the active threads of the group.
Normally ThreadGroup.activeCount()
returns an estimate of the number of active threads in this thread group, so we cannot rely on the this.
One solution is to hold a container of references to all the new threads, but then I have to implement custom synchronized code for accessing the container and blah blah...
The solution I finally followed was to implement an object reference count on the parent class CustomPlugin
.
When a new object of any descendant class rooted from CustomPlugin, reference count is augmented.
When a plugin exits execute()
method, the curring thread exits run()
.
Plugin object reference terminated and destroyed by the JVM GC and the number of concurent plugins is decreased to something less than
MAX_TOTAL_PLUGINS
. Only then a new plugin can be created.
public abstract class CustomPlugin extends Thread implements Plugin{ public static final int MAX_TOTAL_PLUGINS = 3; private static int refCount = 0; public CustomPlugin(String name) throws Exception{ if(!allowLoad()){ throw new Exception("Maximum plugin objects already loaded!"); } Thread.currentThread().setName(name + "-" + Thread.currentThread().getId() ); refCount++; } @Override protected void finalize(){ try { super.finalize(); } catch (Throwable e) { e.printStackTrace(); }finally{ refCount--; } } public static boolean allowLoad() { return (refCount>=MAX_TOTAL_PLUGINS?false:true); } public abstract execute(String [] args); }Remember that you have only
CustomPlugin.MAX_TOTAL_PLUGINS=3
available threads that you can use for your plugins, meaning that only MAX_TOTAL_PLUGINS can be used in total, regardless if their threads are sleeping! When a plugin exits execute()
method, the curring thread exits
run()
.
Plugin object reference terminated and destroyed by the JVM GC and the number of concurrent plugins is decreased to something less
than MAX_TOTAL_PLUGINS
. Only then a new plugin can be called.