- Chương trình của em gặp vấn đề là sử dụng biến int count, nó không phải thread safe, dẫn đến bị sai
- Các cách giải quyết
Cách 1. Dùng join như em:
public class MultiThreadCountingTest {
static AtomicInteger count = new AtomicInteger();
public static void main(String[] args) throws Exception {
int threadCount = 50;
List list = new ArrayList();
for (int i = 0; i {
for (int i1 = 0; i1 < 200000; i1++) {
count.incrementAndGet();
}
});
th.start();
list.add(th);
}
for (Thread thread : list) {
thread.join();
}
System.out.println("Count: "+count);
}
}
Cách 2. Dùng CountDownLatch:
public class MultiThreadCountingTest {
static AtomicInteger count = new AtomicInteger();
public static void main(String[] args) throws Exception {
int threadCount = 50;
CountDownLatch countDownLatch = new CountDownLatch(threadCount);
for (int i = 0; i {
for (int i1 = 0; i1 < 200000; i1++) {
count.incrementAndGet();
}
countDownLatch.countDown();
});
th.start();
}
countDownLatch.await();
System.out.println("Count: "+count);
}
}
Cách 3. Dùng biến count thread done:
public class MultiThreadCountingTest {
static AtomicInteger count = new AtomicInteger();
public static void main(String[] args) throws Exception {
int threadCount = 50;
AtomicInteger doneCount = new AtomicInteger();
for (int i = 0; i {
for (int i1 = 0; i1 < 200000; i1++) {
count.incrementAndGet();
}
doneCount.incrementAndGet();
});
th.start();
}
while (doneCount.get() != threadCount) {
Thread.sleep(1);
}
System.out.println("Count: "+count);
}
}
- Join: Waits for this thread to die. An invocation of this method behaves in exactly the same way as the invocation join(0). Như vậy là nó sẽ phải đợi cho đến khi nào cái thread gọi join nó kết thúc em ạ.