Condivisione della tecnologia

Il thread principale termina e il thread figlio non viene più eseguito

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Contesto del problema:

Il motivo è che durante l'esecuzione dei blocchi distribuiti, ho creato 10 thread nello unit test e poi li ho avviati. Ogni thread stamperà il contenuto nel metodo run, ma i risultati del test in realtà non restituiscono nulla. Ero molto perplesso, quindi ho ipotizzato che il thread principale avrebbe potuto terminare l'esecuzione del thread secondario e terminare direttamente. Abbastanza sicuro, l'aggiunta di thread.join() ha ottenuto il risultato previsto.

Conclusione del problema:

Questo problema non esiste se è scritto nel metodo main, ma esiste nel test singolo.

Processo problematico:

Codice originale:

  1. @Test
  2. public void multipleThreadTest(){
  3. System.out.println(Thread.currentThread().getName());
  4. LockThread[] lockThreads = new LockThread[10];
  5. for (int i=0;i< lockThreads.length;i++){
  6. lockThreads[i] = new LockThread(new ZkNodeNoneBlockingLock("app"));
  7. }
  8. for (LockThread lockThread : lockThreads) {
  9. lockThread.start();
  10. }
  11. }
  12. private static class LockThread extends Thread{
  13. ZkNodeNoneBlockingLock locker;
  14. public LockThread(ZkNodeNoneBlockingLock locker){
  15. this.locker = locker;
  16. }
  17. @Override
  18. public void run() {
  19. boolean lock = locker.lock();
  20. System.out.println(this.getName() + (lock ? "上锁成功" : "上锁失败"));
  21. }
  22. }

Codice modificato:

  1. @Test
  2. public void multipleThreadTest(){
  3. System.out.println(Thread.currentThread().getName());
  4. LockThread[] lockThreads = new LockThread[10];
  5. for (int i=0;i< lockThreads.length;i++){
  6. lockThreads[i] = new LockThread(new ZkNodeNoneBlockingLock("app"));
  7. }
  8. for (LockThread lockThread : lockThreads) {
  9. lockThread.start();
  10. }
  11. for (LockThread lockThread : lockThreads){
  12. try {
  13. lockThread.join();
  14. } catch (InterruptedException e) {
  15. throw new RuntimeException(e);
  16. }
  17. }
  18. }
  19. private static class LockThread extends Thread{
  20. ZkNodeNoneBlockingLock locker;
  21. public LockThread(ZkNodeNoneBlockingLock locker){
  22. this.locker = locker;
  23. }
  24. @Override
  25. public void run() {
  26. boolean lock = locker.lock();
  27. System.out.println(this.getName() + (lock ? "上锁成功" : "上锁失败"));
  28. }
  29. }

Nota:

Thread.join() è il thread corrente, ovvero il thread principale non può continuare l'esecuzione finché l'esecuzione del thread thread non viene completata.