2013-07-25 40 views
0

對你們所有人來說,美好的一天。是時間檢查內部可能的,而真實線程條件

我有一個如下所示的線程,它在它的while條件中持續檢查HashSet中的數據,如果它存在,它會提取這些數據並執行某些操作,並且在HashSet中沒有5分鐘的符號(這裏是我的問題我怎麼能保持這樣的條件在其他下面的框是可能的)

package com; 

import java.util.HashSet; 

public class Tester extends Thread 

{ 

    HashSet<String> set = new HashSet<String>(); 

    public void run() { 

     while (true) { 

      try { 

       if (set.size() > 0) { 

        // extract those and do something 
        set.clear(); 
       } 

       else { 

        // if there were no elements in set for more than 5 minutes than execute a task 
        // here is my question , to keep such a check is possible or not 


       } 

       Thread.sleep(2000); 
      } catch (Exception e) { 

      } 

     } 
    } 

    public static void main(String args[]) { 
     try { 
      Tester qT = new Tester(); 
      qT.start(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

} 

回答

1

您可以初始化循環之前的時間戳。然後,如果set.size() > 0爲true,則將時間戳更新爲當前時間。在else中,檢查保存的時間戳是否至少比當前時間戳早5分鐘。

你可能想是這樣的:

package com; 

import java.util.HashSet; 
import java.util.Date; 

public class Tester extends Thread 
{ 
    HashSet<String> set = new HashSet<String>(); 

    public void run() { 
     Date d = new Date(); 
     while (true) { 
      try { 
       if (set.size() > 0) { 
        d = new Date(); 
        set.clear(); 
       } 
       else { 
        if(new Date().getTime() - d.getTime() > 300000){ 
         d = new Date(); 
         //execute your method 
        } 
       } 

       Thread.sleep(2000); 
      } catch (Exception e) { 
      } 
     } 
    } 

    public static void main(String args[]) { 
     try { 
      Tester qT = new Tester(); 
      qT.start(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

} 
+0

你的想法看起來不錯,但我無法編譯這個 – Kiran

+0

@Kiran,我修復了代碼。現在它爲我編譯。 –

+0

非常感謝,如果我有d = new Date(); ,它不會是太多對象的問題嗎? – Kiran

0

首先,創建一個定時器:

Timer timer = new Timer(300000, new ActionListener() { 
    public void actionPerformed(ActionEvent event) { 
     <preform the task here> 
    } 
}); 
timer.setRepeats(false); 

當線程啓動時,啓動定時器:

timer.start(); 

如果有中的物品:

timer.restart(); 

有沒有其他需要,定時器照顧。您應該在主循環條件中檢查timer.isRunning,以便在5分鐘後停止對設置元素的檢查。

1

當線程進入運行時,獲取SystemTime。同樣在else塊中獲取當前時間,如下所示:另外,如果我們從hashset獲取數據,則只需計算新的系統時間t1 package com;

import java.util.HashSet; 

public class Tester extends Thread 

{ 

HashSet<String> set = new HashSet<String>(); 

public void run() { 
    long t1 = date.getTime(); 
    while (true) { 

     try { 

      if (set.size() > 0) { 

       // extract those and do something 
       set.clear(); 
      } 

      else { 

       // if there were no elements in set for more than 5 minutes than  execute a task 
       // here is my question , to keep such a check is possible or not 

long t1 = date.getTime(); 
if(!hashset_data_not_available) 
{ 
t1 = date.getTime(); 
} 
if((t2-t1)/(60*1000)>5 && if_hashset_data_not_available) { 
//do something that u wanna do 
{ 
      } 

      Thread.sleep(2000); 
     } catch (Exception e) { 
+0

爲什麼不使用問題中使用的相同條件? –