Chcę utworzyć funkcję wykonującą pewne zadanie i zwrócić listę co minutę. Ale na razie z pomocą To I kilka innych linków, które mogę wydrukować wynik, ale nie zwrócić go

Mój kod wygląda następująco:

 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;

}

Głównym celem jest ten kod powinien być umieszczony wewnątrz funkcji, który zwróci załącznikową listę co minutę.

0
Dheeraj Chelaramani 5 czerwiec 2018, 08:53

3 odpowiedzi

Najlepsza odpowiedź

Oto problem - funkcja zwraca tylko raz na wywołanie - nie wiele razy (np. Raz na minutę).

Więc zadzwoń do swojej funkcji raz na minutę.

Lub wsuń listę w niektórych zmiennych członków, a każda minuta informuje "dzwoniące", żeby się przyglądać.

Ale teraz zbliżamy się do wzoru słuchacza. Więc w ui mówimy przycisk. I mamy wiele części kodu, który chce być powiadamiany po naciśnięciu przycisku - dodajemy te rzeczy, które chcą być powiadamiane jako słuchacze do przycisku. Następnie, gdy zdarzenie nastąpi na przycisku, możemy przemierzać listę słuchaczy i powiedzieć im, że wydarzenie się wydarzyło.

Nieco bardziej wyrafinowane użycie tego wzoru jest działaniami:

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

https://docs.Oracle.com/javase/7/docs/api/javax/swing/action.html.

1
Rick 5 czerwiec 2018, 06:10

Jest to scenariusz konsumentów producentów. Twoim zadaniem w wątku jest producentem i tego, czego potrzebujesz, jest konsumentem w innym spożywaniu wyników producentów wątków. To może zacząć:

    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();
    }
0
Michal 5 czerwiec 2018, 06:10

Utwórz własne zadanie niestandardowe, które rozszerza timerask. W swoim konstruktorze dodaj listę, która odpowiada Twoim potrzebom. Następnie w metodzie Uruchom właśnie zmodyfikuj listę.

Przykład

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;
    }
}

Uwaga: Sprawdź klasy współbieżności Javy. Jest tylko jedna lista, ale istnieje wiele różnych rodzajów kolejek. Dokumentacja Dobre miejsce do rozpoczęcia.

0
William Burnham 5 czerwiec 2018, 07:05