我想创建一个执行某项任务并每分钟返回一次列表的函数。但是现在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;
}
主要目标是将此代码放在一个函数中,该函数将每分钟返回结果列表。
答案 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是个好地方。