X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fworkers%2FAlignCalcManager.java;h=ec80576283e2953dad54408457b12c8283010a64;hb=586ade46bdcd05ff028a1cff82c3c527326d28ec;hp=c596f05318719c55720d9fe26d1a46eb8550fe30;hpb=54f6fe32b978af0932428981a56c9960b0df44a7;p=jalview.git diff --git a/src/jalview/workers/AlignCalcManager.java b/src/jalview/workers/AlignCalcManager.java index c596f05..ec80576 100644 --- a/src/jalview/workers/AlignCalcManager.java +++ b/src/jalview/workers/AlignCalcManager.java @@ -22,10 +22,12 @@ package jalview.workers; import jalview.api.AlignCalcManagerI; import jalview.api.AlignCalcWorkerI; +import jalview.bin.Cache; import jalview.datamodel.AlignmentAnnotation; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.Hashtable; import java.util.List; @@ -37,48 +39,49 @@ public class AlignCalcManager implements AlignCalcManagerI /* * list of registered workers */ - private volatile List restartable; + private final List restartable = Collections + .synchronizedList(new ArrayList()); /* * types of worker _not_ to run (for example, because they have * previously thrown errors) */ - private volatile List> blackList; + private final List> blackList = Collections + .synchronizedList(new ArrayList>()); /* * global record of calculations in progress */ - private volatile List inProgress; + private final List inProgress = Collections + .synchronizedList(new ArrayList()); /* * record of calculations pending or in progress in the current context */ - private volatile Map, List> updating; + private final Map, List> updating = + new Hashtable, List>(); /* * workers that have run to completion so are candidates for visual-only * update of their results */ - private HashSet canUpdate; + private HashSet canUpdate = new HashSet<>();; - /** - * Constructor - */ - public AlignCalcManager() + private static boolean listContains(List upd, + AlignCalcWorkerI worker) { - restartable = Collections - .synchronizedList(new ArrayList()); - blackList = Collections.synchronizedList( - new ArrayList>()); - inProgress = Collections - .synchronizedList(new ArrayList()); - updating = Collections.synchronizedMap( - new Hashtable, List>()); - canUpdate = new HashSet(); + // avoid use of 'Contains' in case + for (AlignCalcWorkerI _otherworker : upd) + { + if (_otherworker == upd) + { + return true; + } + } + return false; } - @Override - public void notifyStart(AlignCalcWorkerI worker) + public void notifyStarted(AlignCalcWorkerI worker) { synchronized (updating) { @@ -90,7 +93,16 @@ public class AlignCalcManager implements AlignCalcManagerI } synchronized (upd) { - upd.add(worker); + if (listContains(upd, worker)) + { + Cache.log.debug( + "Ignoring second call to notifyStart for worker " + + worker); + } + else + { + upd.add(worker); + } } } } @@ -103,22 +115,10 @@ public class AlignCalcManager implements AlignCalcManagerI @Override public boolean isPending(AlignCalcWorkerI workingClass) { - List upd; synchronized (updating) { - upd = updating.get(workingClass.getClass()); - if (upd == null) - { - return false; - } - synchronized (upd) - { - if (upd.size() > 1) - { - return true; - } - } - return false; + List upd = updating.get(workingClass.getClass()); + return upd != null && upd.size() > 1; } } @@ -127,7 +127,7 @@ public class AlignCalcManager implements AlignCalcManagerI { synchronized (inProgress) { - if (inProgress.contains(worker)) + if (listContains(inProgress, worker)) { return false; // worker is already working, so ask caller to wait around } @@ -144,7 +144,7 @@ public class AlignCalcManager implements AlignCalcManagerI { synchronized (inProgress) { - // System.err.println("Worker " + worker + " marked as complete."); + Cache.log.debug("Worker " + worker + " marked as complete."); inProgress.remove(worker); List upd = updating.get(worker.getClass()); if (upd != null) @@ -181,7 +181,15 @@ public class AlignCalcManager implements AlignCalcManagerI { if (!isDisabled(worker)) { - Thread tw = new Thread(worker); + Thread tw = new Thread(() -> { + try + { + worker.run(); + } catch (Throwable e) + { + e.printStackTrace(); + } + }); tw.setName(worker.getClass().toString()); tw.start(); } @@ -216,7 +224,7 @@ public class AlignCalcManager implements AlignCalcManagerI { synchronized (restartable) { - if (!restartable.contains(worker)) + if (!listContains(restartable, worker)) { restartable.add(worker); } @@ -289,7 +297,7 @@ public class AlignCalcManager implements AlignCalcManagerI public List getRegisteredWorkersOfClass( Class workerClass) { - List workingClass = new ArrayList(); + List workingClass = new ArrayList<>(); synchronized (canUpdate) { for (AlignCalcWorkerI worker : canUpdate) @@ -313,11 +321,11 @@ public class AlignCalcManager implements AlignCalcManagerI } @Override - public void removeRegisteredWorkersOfClass( + public void removeWorkersOfClass( Class typeToRemove) { - List removable = new ArrayList(); - Set toremovannot = new HashSet(); + List removable = new ArrayList<>(); + Set toremovannot = new HashSet<>(); synchronized (restartable) { for (AlignCalcWorkerI worker : restartable) @@ -367,7 +375,7 @@ public class AlignCalcManager implements AlignCalcManagerI * first just find those to remove (to avoid * ConcurrentModificationException) */ - List toRemove = new ArrayList(); + List toRemove = new ArrayList<>(); for (AlignCalcWorkerI worker : restartable) { if (worker.involves(ann))