Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程睡眠使其他线程等待_Java_Multithreading_Java Threads - Fatal编程技术网

Java 线程睡眠使其他线程等待

Java 线程睡眠使其他线程等待,java,multithreading,java-threads,Java,Multithreading,Java Threads,我有一个任务,当为用户生成随机密码时,短信应该在4分钟后发出,但欢迎短信应该立即发出。由于密码我设置第一,需要发送4分钟后,我使线程睡眠(不能使用ExecutorServices),并欢迎短信线程开始 代码如下: String PasswordSMS="Dear User, Your password is "+'"'+"goody"+'"'+" Your FREE recharge service is LIVE now!"; String welcomeSMS="Dear goody, W

我有一个任务,当为用户生成随机密码时,短信应该在4分钟后发出,但欢迎短信应该立即发出。由于密码我设置第一,需要发送4分钟后,我使线程睡眠(不能使用ExecutorServices),并欢迎短信线程开始

代码如下:

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> 
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();
}
因此,如果我改变顺序,线程sendWelcomesms2立即启动。我必须发送欢迎短信,然后发送密码短信(4分钟后)如何实现

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

Thread.sleep(4 * 60 * 1000);

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

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


您可能希望在
GupShupSMSUtill()中发出sleep命令(
(可能将其签名更改为类似于
GupShupSMSUtill(PasswordSMS,MOB_NUM,sleeptime)
,以便能够控制它的睡眠时间)。

只有在

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
您可以使用join():

或闩锁:

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 {          
            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> 
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”的末尾:


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

因为您首先为主线程调用
sleep
,然后为第二个线程调用
start
。请逐步运行该代码。从构造函数内部调用
sleep()
?听起来像是糟糕的设计。在一个好的设计中,每种方法都有一个职责。构造函数的职责是初始化其类的实例<代码>睡眠()不初始化任何内容。