คำตอบที่มีอยู่กล่าวได้join()
ในแต่ละหัวข้อ
แต่มีหลายวิธีในการรับเธรดอาร์เรย์ / รายการ:
- เพิ่มเธรดลงในรายการที่สร้าง
- ใช้
ThreadGroup
เพื่อจัดการเธรด
รหัสต่อไปนี้จะใช้ThreadGruop
แนวทาง สร้างกลุ่มก่อนจากนั้นเมื่อสร้างแต่ละเธรดให้ระบุกลุ่มในตัวสร้างหลังจากนั้นจะได้รับเธรดอาร์เรย์ผ่านThreadGroup.enumerate()
รหัส
SyncBlockLearn.java
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;
}
}
}
เธรดหลักจะรอให้เธรดทั้งหมดในกลุ่มเสร็จสิ้น