Thread.join()不好用的解决方法

    技术2022-05-20  62

    Thread中有一个public final void join () 方法是让当前线程去等待调用这个join方法的那个线程的结束。

     

    看下面一个例子 public class TestThreadException {     /**      * @param args      */     public static void main(String[] args) {         Thread thread = new Thread(new Runnable() {             @Override             public void run() {                 System.out.println("New thread is working");                 try {                     Thread.sleep(3000);                 } catch (InterruptedException e) {                     // TODO Auto-generated catch block                     e.printStackTrace();                 }                 throw new RuntimeException(" Excpetion occurs in brach thread");             }                     });                 thread.start();                 try {             thread.join();         } catch (InterruptedException e1) {             // TODO Auto-generated catch block             e1.printStackTrace();         }                 while (true) {             System.out.println("Main thread is working");             try {                 Thread.sleep(1000);             } catch (InterruptedException e) {                 // TODO Auto-generated catch block                 e.printStackTrace();             }         }     } }

     

    但是最近有个UT测试的时候发现,假设A线程调用B线程的join方法,但是它根本不等待B线程结束就直接执行下面的程序了。

    还有一件奇怪的事是Debug时却会等待。

     

    最后的猜测是在执行join()这个线程时,B线程还没完全初始化好,所以A线程调用它的join方法就直接返回了。

    如果在执行前调用Thread.sleep(100), 让A线程稍微等一下, 那程序就正常等待了。

     

     

    ----------------------------------------------------------------------------------------------------------------------------------------------

    <<后续>>

    刚刚仔细研究了一下,其实并不是Thread.join的问题。是因为这个Thread结束后又启动了第三个Thread. 第三个Thread会修改一些变量的值. 而我们的测试用例会测试这些变量。 因为join结束后,第三个线程还没有开始运行,所以测试会失败。表面上看起来好像是join方法的问题。 解决方案是在join方法后加Thread.sleep(100),而不是在之前加!


    最新回复(0)