如何执行任务并每分钟返回一次数据

时间:2018-06-05 05:53:39

标签: java list loops timer

我想创建一个执行某项任务并每分钟返回一次列表的函数。但是现在this的帮助 和其他一些链接我能够打印结果但不返回它。主要原因是返回类型的run方法是void,它没有变成列表。

我的代码如下:

 List<String> ignoreList=new ArrayList<>();
   Map<String,List<String>> deviceMap=new HashMap<>(); 
   List<String> newlyAddedUUIDList=new ArrayList<>(); 

    int MINUTES = 1; // The delay in minutes
    Timer timer = new Timer();
     timer.schedule(new TimerTask() {
        @Override
        public void run() { // Function runs every MINUTES minutes.
            // Run the code you want here
   String xSubjectToken=SecretIdRetreiver.getXSubjectToken();
   Map<String, List<String>> uuidInfo= SecretIdRetreiver.getUUIDList(xSubjectToken); // If the function you wanted was static
   System.out.println(uuidInfo);
   Set<String> uuidSetList=uuidInfo.keySet();
   for(String uuid: uuidSetList) {
       if(ignoreList.contains(uuid)) {
          System.out.println("UUid already in the ignore list"); 
       }else {
           if(!deviceMap.containsKey(uuid)) {
               Map<String,List<String>> resultOfSC1=SecretIdRetreiver.performStage1Config(xSubjectToken, uuid);
               System.out.println(resultOfSC1);
               if(resultOfSC1.containsKey("AddInIgnoreList")) {
                   List<String> result=resultOfSC1.get("AddInIgnoreList");
                   String uuidToBeIgnored=result.get(0);
                       ignoreList.add(uuidToBeIgnored);                    
               }else if(resultOfSC1.containsKey("Successful")) {
                   List<String> result=resultOfSC1.get("Successful");
                   System.out.println(result);
                   String deviceId=result.get(1);
//                 System.out.println(deviceId);
                   String[] deviceuUIdSplit=deviceId.split("\\.");
                   String duUID=deviceuUIdSplit[0];
                   System.out.println(duUID);
                   String serialNumber=result.get(0);
                   String secretNumber=result.get(2);
                   List<String> info=new ArrayList<>();
                   info.add(secretNumber);
                   info.add(serialNumber);
                   if(deviceMap.containsKey(duUID)) {

                   }else {
                       newlyAddedUUIDList.add(duUID);
                   }
                   deviceMap.put(duUID, info);

               }
           }else {
               System.out.println("Already Added in the Device list");
           }

       }

   }
   getNewAddedUUId(newlyAddedUUIDList);
//   System.out.println(newlyAddedUUIDList+"NewAdded UUIDs");
   newlyAddedUUIDList.clear();


        }


      }, 0, 1000 * 60 * MINUTES);

    public static List<String> getNewAddedUUId(List<String> newlyAdded) {
    // TODO Auto-generated method stub
    System.out.println(newlyAdded+"Newly Added UUIDs");
    return newlyAdded;

}

主要目标是将此代码放在一个函数中,该函数将每分钟返回结果列表。

3 个答案:

答案 0 :(得分:1)

这就是问题 - 一个函数每次调用只返回一次 - 而不是多次(例如每分钟一次)。

所以要么每分钟调用一次你的函数。

或者将列表推送到某个成员变量中,每分钟都会告诉“来电者”。去看看吧。

但是现在我们已经接近了一个Listener模式。所以在UI中我们说有一个按钮。我们有多个代码部分,当按下按钮时都希望得到通知 - 所以我们将那些想要作为监听器通知的东西添加到按钮中。然后,当按钮上发生事件时,我们可以遍历侦听器列表并告诉他们事件已经发生。

使用Actions:

稍微复杂一点地使用这种模式

https://docs.oracle.com/javase/tutorial/uiswing/misc/action.html

https://docs.oracle.com/javase/7/docs/api/javax/swing/Action.html

答案 1 :(得分:0)

这是生产者消费者情景。你的任务及时线程是生产者,你需要的是消费者在另一个消费生产者结果的线程。这可以帮助您入门:

    BlockingQueue<Object> results = new LinkedBlockingDeque<>();

    //your task (aka producer)
    Runnable task = ()->{
        Object result = //compute your result
        results.add(result);
    };
    ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);        
    executor.scheduleAtFixedRate(task,0, 1, TimeUnit.MINUTES);

    //consumer
    while(true) {
        Object result = results.take();
    }

答案 2 :(得分:0)

制作扩展TimerTask的自定义任务。在其构造函数中添加一个适合您需求的列表。然后在run方法中修改你的列表。

实施例

public class MyTimerTask extends TimerTask {
    public MyTimerTask(List<MyObject> objects) {
        super();
        this.objects = objects;
    }
    private final List<MyObject> objects;

    @Override
     public void run() {
         // your logic
         objects.add(whatever);
     }

    public List<MyObject> getElements() {
         return objects;
    }
}

注意:查看Java的并发类。只有一个列表,但有许多不同类型的队列。 documentation是个好地方。