2015-06-16 82 views
-3

我有一個任務,當爲用戶生成一個隨機密碼SMS後應該去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> 

所以,如果我改變順序線程sendWelcomesms2立即starts.I需要發送短信的歡迎然後密碼短信(4分鐘後)如何實現它?

注:兩個短信來了4分鐘後

+3

因爲您首先爲您的主線程調用'sleep',然後爲第二個線程調用'start'。 – Marvin

+0

一步一步地運行該代碼。 – njzk2

回答

4
Thread.sleep(4 * 60 * 1000); 

延誤您的當前運行的線程的執行,不執行你的q.start(),直到等待時間結束。這個命令沒有意義。

-1

您正在睡當前線程,然後發出qstart命令。

您可能想要發出睡眠GupShupSMSUtill()(也許將其簽名更改爲像這樣的東西,以便能夠控制睡眠時間)。

+0

從構造函數中調用'sleep()'?聽起來很糟糕的設計。在一個好的設計中,每種方法都有一個責任。構造函數的責任是初始化其類的一個實例。 'sleep()'不會初始化任何東西。睡眠裏面的運行方法當然是 –

+0

。 – ths

1

當執行

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 
0

您可以訂購一個線程等待另一個線程的結束。

到這裏看看:

您可以使用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(); 
} 

或者LAT CH:

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)的這個案例。