τα στοιχεία επικοινωνίας μου
Ταχυδρομείο[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Ο λόγος είναι ότι όταν έκανα κατανεμημένες κλειδαριές, δημιούργησα 10 νήματα στη δοκιμή μονάδας και μετά τα ξεκίνησα. Κάθε νήμα θα εκτυπώνει περιεχόμενο στη μέθοδο εκτέλεσης, αλλά τα αποτελέσματα της δοκιμής στην πραγματικότητα δεν βγάζουν τίποτα. Ήμουν πολύ μπερδεμένος και μετά υπέθεσα ότι το κύριο νήμα μπορεί να είχε ολοκληρώσει την εκτέλεση του δευτερεύοντος νήματος και να τελείωσε άμεσα, προσθέτοντας το 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() είναι το τρέχον νήμα, δηλαδή, το κύριο νήμα δεν μπορεί να συνεχίσει να εκτελείται μέχρι να ολοκληρωθεί η εκτέλεση του νήματος.