Teknologian jakaminen

Pääsäie päättyy ja alasäie ei enää suorita

2024-07-12

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

Ongelman tausta:

Syynä on se, että tehdessäni hajautettuja lukkoja loin yksikkötestissä 10 säiettä ja aloitin ne. Jokainen säie tulostaa sisällön ajomenetelmällä, mutta testitulokset eivät itse asiassa tulosta mitään. Olin hyvin ymmälläni, ja sitten arvelin, että pääsäie saattoi suorittaa alasäikeen ja päättynyt suoraan. Viesti.join()-tiedoston lisääminen tuotti odotetun tuloksen.

Ongelman johtopäätös:

Tätä ongelmaa ei ole, jos se on kirjoitettu päämenetelmässä, mutta tämä ongelma esiintyy yksittäisessä testauksessa.

Ongelmaprosessi:

Alkuperäinen koodi:

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

Muokattu koodi:

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

Huomautus:

Thread.join() on nykyinen säie, eli pääsäie ei voi jatkaa suoritusta ennen kuin säikeen suoritus on valmis.