Technologieaustausch

Der Hauptthread endet und der untergeordnete Thread wird nicht mehr ausgeführt

2024-07-12

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

Problemhintergrund:

Der Grund dafür ist, dass ich beim Ausführen verteilter Sperren im Unit-Test 10 Threads erstellt und diese dann gestartet habe. Jeder Thread druckt Inhalte in der Ausführungsmethode, aber die Testergebnisse geben tatsächlich nichts aus. Ich war sehr verwirrt und spekulierte dann, dass der Haupt-Thread die Ausführung des Unter-Threads beendet haben könnte und tatsächlich beendet wurde, das Hinzufügen von thread.join() lieferte das erwartete Ergebnis.

Problemschluss:

Dieses Problem besteht nicht, wenn es in der Hauptmethode geschrieben wird, aber dieses Problem besteht beim Einzeltest.

Problemprozess:

Originalcode:

  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. }

Geänderter Code:

  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. }

Notiz:

Thread.join () ist der aktuelle Thread, dh der Hauptthread kann nicht weiter ausgeführt werden, bis die Ausführung des Thread-Threads abgeschlossen ist.