You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@jakarta.apache.org by se...@apache.org on 2010/12/11 12:06:41 UTC

svn commit: r1044634 - /jakarta/jmeter/trunk/src/core/org/apache/jmeter/engine/StandardJMeterEngine.java

Author: sebb
Date: Sat Dec 11 11:06:40 2010
New Revision: 1044634

URL: http://svn.apache.org/viewvc?rev=1044634&view=rev
Log:
ConcurrentHashMap does not need to be protected by synch.
Use for loops where possible to tidy code

Modified:
    jakarta/jmeter/trunk/src/core/org/apache/jmeter/engine/StandardJMeterEngine.java

Modified: jakarta/jmeter/trunk/src/core/org/apache/jmeter/engine/StandardJMeterEngine.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/engine/StandardJMeterEngine.java?rev=1044634&r1=1044633&r2=1044634&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/core/org/apache/jmeter/engine/StandardJMeterEngine.java (original)
+++ jakarta/jmeter/trunk/src/core/org/apache/jmeter/engine/StandardJMeterEngine.java Sat Dec 11 11:06:40 2010
@@ -30,6 +30,7 @@ import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Properties;
 import java.util.concurrent.ConcurrentHashMap;
 
@@ -137,26 +138,20 @@ public class StandardJMeterEngine implem
         if (engine == null) {
             return false;// e.g. not yet started
         }
-        JMeterThread thrd=null;
-        synchronized (engine.allThreads) { // Protect iterator
-            Iterator<JMeterThread> iter = engine.allThreads.keySet().iterator();
-            while(iter.hasNext()){
-                thrd = iter.next();
-                if (thrd.getThreadName().equals(threadName)){
-                    break; // Found matching thread
-                }
-            }
-        }
-        if (thrd != null) {
-            thrd.stop();
-            thrd.interrupt();
-            if (now) {
-                Thread t = engine.allThreads.get(thrd);
-                if (t != null) {
-                    t.interrupt();
+        // ConcurrentHashMap does not need synch. here
+        for(Entry<JMeterThread, Thread> entry : engine.allThreads.entrySet()){
+            JMeterThread thrd = entry.getKey();
+            if (thrd.getThreadName().equals(threadName)){
+                thrd.stop();
+                thrd.interrupt();
+                if (now) {
+                    Thread t = entry.getValue();
+                    if (t != null) {
+                        t.interrupt();
+                    }
                 }
+                return true;
             }
-            return true;
         }
         return false;
     }
@@ -255,7 +250,7 @@ public class StandardJMeterEngine implem
 
     private void removeThreadGroups(List<?> elements) {
         Iterator<?> iter = elements.iterator();
-        while (iter.hasNext()) {
+        while (iter.hasNext()) { // Can't use for loop here because we remove elements
             Object item = iter.next();
             if (item instanceof AbstractThreadGroup) {
                 iter.remove();
@@ -267,9 +262,7 @@ public class StandardJMeterEngine implem
 
     @SuppressWarnings("deprecation") // Deliberate use of deprecated method
     private void notifyTestListenersOfStart(SearchByClass<TestListener> testListeners) {
-        Iterator<TestListener> iter = testListeners.getSearchResults().iterator();
-        while (iter.hasNext()) {
-            TestListener tl = iter.next();
+        for (TestListener tl : testListeners.getSearchResults()) {
             if (tl instanceof TestBean) {
                 TestBeanHelper.prepare((TestElement) tl);
             }
@@ -283,9 +276,7 @@ public class StandardJMeterEngine implem
 
     private void notifyTestListenersOfEnd(SearchByClass<TestListener> testListeners) {
         log.info("Notifying test listeners of end of test");
-        Iterator<TestListener> iter = testListeners.getSearchResults().iterator();
-        while (iter.hasNext()) {
-            TestListener tl = iter.next();
+        for (TestListener tl : testListeners.getSearchResults()) {
             try {
                 if (host == null) {
                     tl.testEnded();
@@ -509,26 +500,18 @@ public class StandardJMeterEngine implem
 
     private boolean verifyThreadsStopped() {
         boolean stoppedAll = true;
-        List<Thread> threadsToCheck = new ArrayList<Thread>(allThreads.size());
-        synchronized (allThreads) { // Protect iterator
-            Iterator<JMeterThread> iter = allThreads.keySet().iterator();
-            while (iter.hasNext()) {
-                Thread t = allThreads.get(iter.next());
-                if (t != null) {
-                    threadsToCheck.add(t); // Do work later to reduce time in synch block.
-                }
-            }
-        }
-        for(int i=0; i < threadsToCheck.size(); i++) {
-            Thread t = threadsToCheck.get(i);
-            if (t.isAlive()) {
-                try {
-                    t.join(WAIT_TO_DIE);
-                } catch (InterruptedException e) {
-                }
+        // ConcurrentHashMap does not need synch. here
+        for (Thread t : allThreads.values()) {
+            if (t != null) {
                 if (t.isAlive()) {
-                    stoppedAll = false;
-                    log.warn("Thread won't exit: " + t.getName());
+                    try {
+                        t.join(WAIT_TO_DIE);
+                    } catch (InterruptedException e) {
+                    }
+                    if (t.isAlive()) {
+                        stoppedAll = false;
+                        log.warn("Thread won't exit: " + t.getName());
+                    }
                 }
             }
         }
@@ -536,16 +519,14 @@ public class StandardJMeterEngine implem
     }
 
     private void tellThreadsToStop() {
-        synchronized (allThreads) { // Protect iterator
-            Iterator<JMeterThread> iter = new HashSet<JMeterThread>(allThreads.keySet()).iterator();
-            while (iter.hasNext()) {
-                JMeterThread item = iter.next();
-                item.stop(); // set stop flag
-                item.interrupt(); // interrupt sampler if possible
-                Thread t = allThreads.get(item);
-                if (t != null ) { // Bug 49734
-                    t.interrupt(); // also interrupt JVM thread
-                }
+        // ConcurrentHashMap does not need protecting
+        for (Entry<JMeterThread, Thread> entry : allThreads.entrySet()) {
+            JMeterThread item = entry.getKey();
+            item.stop(); // set stop flag
+            item.interrupt(); // interrupt sampler if possible
+            Thread t = entry.getValue();
+            if (t != null ) { // Bug 49734
+                t.interrupt(); // also interrupt JVM thread
             }
         }
     }
@@ -557,12 +538,9 @@ public class StandardJMeterEngine implem
     }
 
     private void stopAllThreads() {
-        synchronized (allThreads) {// Protect iterator
-            Iterator<JMeterThread> iter = new HashSet<JMeterThread>(allThreads.keySet()).iterator();
-            while (iter.hasNext()) {
-                JMeterThread item = iter.next();
-                item.stop(); // This is quick
-            }
+        // ConcurrentHashMap does not need synch. here
+        for (JMeterThread item : allThreads.keySet()) {
+            item.stop();
         }
     }
 



---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@jakarta.apache.org
For additional commands, e-mail: notifications-help@jakarta.apache.org