minhas informações de contato
Correspondência[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
O motivo é que ao fazer bloqueios distribuídos, criei 10 threads no teste de unidade e depois os iniciei. Cada thread imprimirá conteúdo no método run, mas os resultados do teste na verdade não produzirão nada. Fiquei muito confuso e então especulei que o thread principal poderia ter terminado a execução do subthread e terminado diretamente, adicionar thread.join() obteve o resultado esperado.
Este problema não existe se estiver escrito no método principal, mas existe em testes únicos.
Código original:
- @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 ? "上锁成功" : "上锁失败"));
- }
- }
Código modificado:
- @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() é o thread atual, ou seja, o thread principal não pode continuar a ser executado até que a execução do thread seja concluída.