【问题标题】:Thread Sleep Makes Other Threads Wait线程休眠让其他线程等待
【发布时间】:2015-06-16 13:36:47
【问题描述】:

我有一个任务,在为用户生成随机密码时,SMS 应该在 4 分钟后发送,但欢迎 SMS 应该立即发送。由于密码是我首先设置的,需要在 4 分钟后发送,所以我正在使该线程休眠(不能使用 ExecutorServices),并欢迎 SMS 线程启动。

代码如下:

String PasswordSMS="Dear User, Your password is "+'"'+"goody"+'"'+" Your FREE 
recharge service is LIVE now!";
String welcomeSMS="Dear goody, Welcome to XYZ";
         try {          
            Thread q=new Thread(new GupShupSMSUtill(PasswordSMS,MOB_NUM));
            Thread.sleep(4 * 60 * 1000);
            q.start();
             GupShupSMSUtill sendWelcomesms2=new GupShupSMSUtill(welcomeSMS, MOB_NUM);
                Thread Bal3=new Thread(sendWelcomesms2);
                Bal3.start();

        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

</code> 

因此,如果我更改线程 sendWelcomesms2 立即启动的顺序。我必须发送欢迎短信然后密码短信(4 分钟后)如何实现?

注意:两条短信都在 4 分钟后发送

【问题讨论】:

  • 因为您首先为您的主线程调用sleep,然后为第二个线程调用start
  • 逐步运行该代码。

标签: java multithreading java-threads


【解决方案1】:
Thread.sleep(4 * 60 * 1000);

延迟当前正在运行的线程的执行,直到等待时间结束,您的 q.start() 才会执行。这个顺序没有意义。

【讨论】:

    【解决方案2】:

    您的线程仅在以下情况下创建

    Thread q=new Thread(new GupShupSMSUtill(PasswordSMS,MOB_NUM));
    

    被执行。您的线程在

    时启动
    q.start();
    

    被执行。所以如果你想实现在主线程休眠的时候运行q线程,你应该按这个顺序写你的行:

            Thread q=new Thread(new GupShupSMSUtill(PasswordSMS,MOB_NUM)); // Create thread
            q.start(); // start thread
            Thread.sleep(4 * 60 * 1000); // suspend main thread for 4 sec
    

    【讨论】:

      【解决方案3】:

      你可以使用join():

      String PasswordSMS = "Dear User, Your password is " + "\"" + "goody" + "\"" + " Your FREE recharge service is LIVE now!";
      String welcomeSMS = "Dear goody, Welcome to XYZ";
      try
      {
          GupShupSMSUtill sendWelcomesms2 = new GupShupSMSUtill(welcomeSMS, MOB_NUM);
          Thread Bal3 = new Thread(sendWelcomesms2);
          Bal3.start();
          Thread q = new Thread(new GupShupSMSUtill(PasswordSMS, MOB_NUM));
          q.start();
          q.join();
      }
      catch (InterruptedException e)
      {
          e.printStackTrace();
      }
      

      或闩锁:

      private static java.util.concurrent.CountDownLatch latch = new java.util.concurrent.CountDownLatch(1);
      

      还有代码:

      String PasswordSMS = "Dear User, Your password is " + "\"" + "goody" + "\"" + " Your FREE recharge service is LIVE now!";
      String welcomeSMS = "Dear goody, Welcome to XYZ";
      try
      {
          GupShupSMSUtill sendWelcomesms2 = new GupShupSMSUtill(welcomeSMS, MOB_NUM);
          Thread Bal3 = new Thread(sendWelcomesms2);
          Bal3.start();
          Thread q = new Thread(new GupShupSMSUtill(PasswordSMS, MOB_NUM));
          q.start();
          latch.await(); // Wait
      }
      catch (InterruptedException e)
      {
          e.printStackTrace();
      }
      

      在线程“q”的末尾:

      latch.countDown(); // stop to wait
      

      提示 - 在这种情况下不要使用 Thread.sleep(x)。

      【讨论】:

        【解决方案4】:

        在为q 发出start 命令之前,您正在休眠当前线程。

        您可能想在GupShupSMSUtill() 内部发出睡眠(也许将其签名更改为GupShupSMSUtill(PasswordSMS,MOB_NUM, sleeptime) 之类的东西,以便能够控制它的睡眠时间)。

        【讨论】:

        • 从构造函数内部调用sleep()?听起来像糟糕的设计。在一个好的设计中,每一种方法都有一个职责。构造函数的职责是初始化其类的实例。 sleep() 没有初始化任何东西。
        猜你喜欢
        • 2020-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-04
        • 1970-01-01
        • 2012-11-07
        • 2013-02-20
        • 2011-12-26
        相关资源
        最近更新 更多