Sascha and Larry, I must admit that I am way over my head here. I haven't done much thread programming in Java. (Hopefully Stefan has!)
Sascha wrote: "My primary goal is to simplify the threading code to make it more reliable in terms of time." This seems like an admirable goal to me. If Larry, or a similar programmer of his experience, agrees that this changes would be beneficial, I say we give Sascha a shot at it. It sounds like she has considered her changes carefully. Just my two cents. The Sunburned Surveyor On 5/24/07, Sascha L. Teichmann <[EMAIL PROTECTED]> wrote: > Hi Larry, > > short answer first: No, I don't have any benchmarks, yet. > > The long answer: My primary goal is to simplify the > threading code to make it more reliable in terms of time. > Gaining performance improvements would be a neat side effect. > > Background: Multi-threading may be fine for slow layers > which arrives later on the screen but for exporting > the data (to print/layout e.g) it would be nice to have > them arriving one after the other. > > My final goal is to have a simple switch between the normal > and the serial mode. To archive that I try to carefully > refactor the system doing little patches step by step > not to break it. Refactoring the ThreadQueue with it's > 'flaws' seems a to be a good starting point to me. > > One reason for this change is the fact that you are able > to figure out if the default thread runs empty. But there > is no way to figure out when the last thread ends. That > are different things. A mechanism for this is planned. > > Sorry, if I've shadowed my true intentions to much. Maybe > I should discuss more before I send patches. ;-) > > Back to the technical side: > > The patch needs some testing but I don't expect too much > performance improvement. > > A less intrusive alternative to bind the Runnables that go to the > default ThreadQueue into one thread is to create a container > which self is Runnable (see e.g. RunnableArrayList attached) > and put them into an instance of this class. > This container is put into multiRendererThreadQueue as a Runnable. > With this modification the defaultRendererThreadQueue can > be removed (multiRendererThreadQueue renamed to > defaultRendererThreadQueue). Only an idea ... I'm in discussion > mode now. ;-) > > - Sascha > > > Larry Becker schrieb: > > Hi Sascha, > > > > I read your comments and look at your code with interest. It appears > > to be an improved ThreadQueue implementation, but will require a lot of > > testing to verify. Before I invest this time, I would like to know what > > problem it is solving. I see your dislikes a - e, but these are not > > really problems, only architectural critiques. Have you done any > > benchmarks that show that the new SingleThreadQueue speeds up > > rendering? Your logical argument that it should be more efficient is > > persuasive, but I have been surprised by Java before. > > > > respectfully, > > Larry Becker > > > > On 5/23/07, *Sascha L. Teichmann* <[EMAIL PROTECTED] > > <mailto:[EMAIL PROTECTED]>> wrote: > > > > Hi together, > > > > as some of you may already know i have my dislikes against > > ThreadQueue [1] (Hi, Larry!) see my mail [2] > > > > a - It forks a new thread for any Runnable it processes. > > b - It has an ugly busy wait loop inside. > > c - The event listener for empty queue fires to often. > > d - The default ThreadQueue is some kind of thread serializer. > > e - The DB/WMS ThreadQueue has no public access. > > > > Now I've written a sub class of ThreadQueue: SingleThreadQueue > > (see attachment). This one deals with the issues a, b and d. > > I also attached a patch against RenderingManager [3] to handle e. > > > > The new class (to be placed in package > > com.vividsolutions.jump.workbench.ui.renderer) is a drop-in > > replacement for the default ThreadQueue in RenderingManager. > > Not for the ThreadQueue that handles the DB/WMS layers. > > > > Because Jon limited the number of parallel threads in default > > queue to 1 I see no reason why to fork a new thread for each > > Runnable it processes. Thread creation/shutdown is fairly > > expensive. Instead a single background thread is started > > which processes the Runnables one by one. If the thread > > is idle for 30 secs it shuts itself down. If you have a lot > > of (non-WMS/BB) layers this should improve performance > > and save some resources. The processing itself is done > > with a monitor (synchronized/wait/notify) so there is no > > busy wait any more. > > > > The DB/WMS ThreadQueue (real parallel threads) is left untouched > > for the moment. Depending on my personal schedule I will send > > a patch against this one too. Preliminary code with thread pooling > > exists but it needs a bit more testing. > > > > Find attached the new class and patches against RenderingManager and > > the old ThreadQueue to bring it to work. > > > > Comments are very welcome. :-) > > > > Kind regrads, > > Sascha > > > > [1] com.vividsolutions.jump.workbench.ui.renderer.ThreadQueue > > [2] > > > > http://sourceforge.net/mailarchive/message.php?msg_name=4653389E.6000706%40intevation.de > > [3] com.vividsolutions.jump.workbench.ui.renderer.RenderingManager > > > > Index: > > > > ./src/com/vividsolutions/jump/workbench/ui/renderer/RenderingManager.java > > > > =================================================================== > > RCS file: > > > > /cvsroot/jump-pilot/openjump/src/com/vividsolutions/jump/workbench/ui/renderer/RenderingManager.java,v > > retrieving revision 1.6 > > diff -u - r1.6 RenderingManager.java > > --- > > > > ./src/com/vividsolutions/jump/workbench/ui/renderer/RenderingManager.java > > 22 May 2007 18:47:12 -0000 1.6 > > +++ > > > > ./src/com/vividsolutions/jump/workbench/ui/renderer/RenderingManager.java > > 24 May 2007 04:10:30 -0000 > > @@ -77,7 +77,7 @@ > > * non-database layers in parallel. In fact, it will make > > the GUI less > > * responsive. [Jon Aquino] > > */ > > - private ThreadQueue defaultRendererThreadQueue = new > > ThreadQueue(1); > > + private ThreadQueue defaultRendererThreadQueue = new > > SingleThreadQueue(); > > > > /** > > * WMS and database processing are done on the server side, > > so allow these > > @@ -294,6 +294,10 @@ > > return defaultRendererThreadQueue; > > } > > > > + public ThreadQueue getMultiRendererThreadQueue() { > > + return multiRendererThreadQueue; > > + } > > + > > public void dispose() { > > repaintTimer.stop (); > > defaultRendererThreadQueue.dispose(); > > @@ -334,4 +338,4 @@ > > contentIDToRendererMap.remove(contentID); > > } > > > > -} > > \ No newline at end of file > > +} > > > > Index: > > ./src/com/vividsolutions/jump/workbench/ui/renderer/ThreadQueue.java > > =================================================================== > > RCS file: > > > > /cvsroot/jump-pilot/openjump/src/com/vividsolutions/jump/workbench/ui/renderer/ThreadQueue.java,v > > retrieving revision 1.1 > > diff -u - r1.1 ThreadQueue.java > > --- > > ./src/com/vividsolutions/jump/workbench/ui/renderer/ThreadQueue.java > > 16 > > Jun 2005 22:50:38 -0000 1.1 > > +++ > > ./src/com/vividsolutions/jump/workbench/ui/renderer/ThreadQueue.java > > 24 > > May 2007 04:09:15 -0000 > > @@ -47,6 +47,10 @@ > > private Vector queuedRunnables = new Vector(); > > private int maxRunningThreads; > > > > + public ThreadQueue() { > > + this(1); > > + } > > + > > public ThreadQueue(final int maxRunningThreads) { > > this.maxRunningThreads = maxRunningThreads; > > } > > @@ -95,7 +99,7 @@ > > public static interface Listener { > > public void allRunningThreadsFinished(); > > } > > - private void fireAllRunningThreadsFinished() { > > + protected void fireAllRunningThreadsFinished() { > > //new ArrayList to avoid ConcurrentModificationException > > [Jon Aquino] > > for (Iterator i = new ArrayList(listeners).iterator(); > > i.hasNext(); ) { > > Listener listener = (Listener) i.next(); > > > > > > ------------------------------------------------------------------------- > > This SF.net email is sponsored by DB2 Express > > Download DB2 Express C - the FREE version of DB2 express and take > > control of your XML. No limits. Just data. Click to get it now. > > http://sourceforge.net/powerbar/db2/ > > _______________________________________________ > > Jump-pilot-devel mailing list > > Jump-pilot-devel@lists.sourceforge.net > > <mailto:Jump-pilot-devel@lists.sourceforge.net> > > https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel > > <https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel> > > > > > > > > > > > > -- > > http://amusingprogrammer.blogspot.com/ > > > > > > ------------------------------------------------------------------------ > > > > ------------------------------------------------------------------------- > > This SF.net email is sponsored by DB2 Express > > Download DB2 Express C - the FREE version of DB2 express and take > > control of your XML. No limits. Just data. Click to get it now. > > http://sourceforge.net/powerbar/db2/ > > > > > > ------------------------------------------------------------------------ > > > > _______________________________________________ > > Jump-pilot-devel mailing list > > Jump-pilot-devel@lists.sourceforge.net > > https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel > > ------------------------------------------------------------------------- > This SF.net email is sponsored by DB2 Express > Download DB2 Express C - the FREE version of DB2 express and take > control of your XML. No limits. Just data. Click to get it now. > http://sourceforge.net/powerbar/db2/ > _______________________________________________ > Jump-pilot-devel mailing list > Jump-pilot-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel > > > ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ _______________________________________________ Jump-pilot-devel mailing list Jump-pilot-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel