моя контактная информация
Почтамезофия@protonmail.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Причина в том, что при выполнении распределенных блокировок я создал в модульном тесте 10 потоков, а затем запустил их. Каждый поток будет печатать содержимое в методе run, но результаты теста фактически ничего не выводят. Я был очень озадачен, а затем предположил, что основной поток, возможно, завершил выполнение подпотока и завершился напрямую. Разумеется, добавление thread.join() дало ожидаемый результат.
Этой проблемы не существует, если она записана в основном методе, но она существует при одиночном тестировании.
Исходный код:
- @Test
- public void multipleThreadTest(){
- System.out.println(Thread.currentThread().getName());
- LockThread[] lockThreads = new LockThread[10];
- for (int i=0;i< lockThreads.length;i++){
- lockThreads[i] = new LockThread(new ZkNodeNoneBlockingLock("app"));
- }
- for (LockThread lockThread : lockThreads) {
- lockThread.start();
- }
- }
-
- private static class LockThread extends Thread{
- ZkNodeNoneBlockingLock locker;
- public LockThread(ZkNodeNoneBlockingLock locker){
- this.locker = locker;
- }
- @Override
- public void run() {
- boolean lock = locker.lock();
- System.out.println(this.getName() + (lock ? "上锁成功" : "上锁失败"));
- }
- }
Модифицированный код:
- @Test
- public void multipleThreadTest(){
- System.out.println(Thread.currentThread().getName());
- LockThread[] lockThreads = new LockThread[10];
- for (int i=0;i< lockThreads.length;i++){
- lockThreads[i] = new LockThread(new ZkNodeNoneBlockingLock("app"));
- }
- for (LockThread lockThread : lockThreads) {
- lockThread.start();
- }
- for (LockThread lockThread : lockThreads){
- try {
- lockThread.join();
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
- }
- }
-
- private static class LockThread extends Thread{
- ZkNodeNoneBlockingLock locker;
- public LockThread(ZkNodeNoneBlockingLock locker){
- this.locker = locker;
- }
- @Override
- public void run() {
- boolean lock = locker.lock();
- System.out.println(this.getName() + (lock ? "上锁成功" : "上锁失败"));
- }
- }
Thread.join() — это текущий поток, то есть основной поток не может продолжать выполнение до тех пор, пока не завершится выполнение потока потока.