Κοινή χρήση τεχνολογίας

Το κύριο νήμα τελειώνει και το θυγατρικό νήμα δεν εκτελείται πλέον

2024-07-12

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

Ιστορικό προβλήματος:

Ο λόγος είναι ότι όταν έκανα κατανεμημένες κλειδαριές, δημιούργησα 10 νήματα στη δοκιμή μονάδας και μετά τα ξεκίνησα. Κάθε νήμα θα εκτυπώνει περιεχόμενο στη μέθοδο εκτέλεσης, αλλά τα αποτελέσματα της δοκιμής στην πραγματικότητα δεν βγάζουν τίποτα. Ήμουν πολύ μπερδεμένος και μετά υπέθεσα ότι το κύριο νήμα μπορεί να είχε ολοκληρώσει την εκτέλεση του δευτερεύοντος νήματος και να τελείωσε άμεσα, προσθέτοντας το thread.join() είχε το αναμενόμενο αποτέλεσμα.

Συμπέρασμα προβλήματος:

Αυτό το πρόβλημα δεν υπάρχει εάν είναι γραμμένο στην κύρια μέθοδο, αλλά αυτό το πρόβλημα υπάρχει σε μεμονωμένη δοκιμή.

Διαδικασία προβλήματος:

Αρχικός κωδικός:

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

Τροποποιημένος κωδικός:

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

Σημείωση:

Το Thread.join() είναι το τρέχον νήμα, δηλαδή, το κύριο νήμα δεν μπορεί να συνεχίσει να εκτελείται μέχρι να ολοκληρωθεί η εκτέλεση του νήματος.