मौजूदा जवाब में कहा गया है कि join()
प्रत्येक धागा।
लेकिन थ्रेड सरणी / सूची प्राप्त करने के कई तरीके हैं:
- निर्माण पर एक सूची में थ्रेड जोड़ें।
ThreadGroup
थ्रेड्स को प्रबंधित करने के लिए उपयोग करें ।
निम्नलिखित कोड ThreadGruop
दृष्टिकोण का उपयोग करेगा । यह पहले एक ग्रुप बनाता है, फिर जब प्रत्येक थ्रेड को कंस्ट्रक्टर में समूह निर्दिष्ट करता है, तो बाद में थ्रेड सरणी प्राप्त कर सकता हैThreadGroup.enumerate()
कोड
SyncBlockLearn.java
import org.testng.Assert;
import org.testng.annotations.Test;
/**
* synchronized block - learn,
*
* @author eric
* @date Apr 20, 2015 1:37:11 PM
*/
public class SyncBlockLearn {
private static final int TD_COUNT = 5; // thread count
private static final int ROUND_PER_THREAD = 100; // round for each thread,
private static final long INC_DELAY = 10; // delay of each increase,
// sync block test,
@Test
public void syncBlockTest() throws InterruptedException {
Counter ct = new Counter();
ThreadGroup tg = new ThreadGroup("runner");
for (int i = 0; i < TD_COUNT; i++) {
new Thread(tg, ct, "t-" + i).start();
}
Thread[] tArr = new Thread[TD_COUNT];
tg.enumerate(tArr); // get threads,
// wait all runner to finish,
for (Thread t : tArr) {
t.join();
}
System.out.printf("\nfinal count: %d\n", ct.getCount());
Assert.assertEquals(ct.getCount(), TD_COUNT * ROUND_PER_THREAD);
}
static class Counter implements Runnable {
private final Object lkOn = new Object(); // the object to lock on,
private int count = 0;
@Override
public void run() {
System.out.printf("[%s] begin\n", Thread.currentThread().getName());
for (int i = 0; i < ROUND_PER_THREAD; i++) {
synchronized (lkOn) {
System.out.printf("[%s] [%d] inc to: %d\n", Thread.currentThread().getName(), i, ++count);
}
try {
Thread.sleep(INC_DELAY); // wait a while,
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.printf("[%s] end\n", Thread.currentThread().getName());
}
public int getCount() {
return count;
}
}
}
मुख्य धागा समूह में सभी थ्रेड्स के समाप्त होने तक प्रतीक्षा करेगा।