বিদ্যমান উত্তর join()
প্রতিটি থ্রেড পারে বলেছিলেন ।
তবে থ্রেড অ্যারে / তালিকা পাওয়ার বিভিন্ন উপায় রয়েছে:
- থ্রেডটি তৈরির তালিকায় যুক্ত করুন।
ThreadGroup
থ্রেড পরিচালনা করতে ব্যবহার করুন ।
নিম্নলিখিত কোডটি ThreadGruop
পদ্ধতির ব্যবহার করবে । এটি প্রথমে একটি গ্রুপ তৈরি করে, তারপরে প্রতিটি থ্রেড তৈরি করার পরে কনস্ট্রাক্টরে গ্রুপটি নির্দিষ্ট করে, পরবর্তীতে থ্রেড অ্যারেটি পেতে পারেThreadGroup.enumerate()
কোড
সিঙ্কব্লকলায়ার্ন.জভা
import org.testng.Assert;
import org.testng.annotations.Test;
public class SyncBlockLearn {
private static final int TD_COUNT = 5;
private static final int ROUND_PER_THREAD = 100;
private static final long INC_DELAY = 10;
@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);
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();
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);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.printf("[%s] end\n", Thread.currentThread().getName());
}
public int getCount() {
return count;
}
}
}
মূল থ্রেডটি গ্রুপের সমস্ত থ্রেড সমাপ্ত হওয়ার জন্য অপেক্ষা করবে।