Java real-time список задач

  • Автор теми Cris
  • Дата створення

Cris

Member
Как в java можно реализовать такое:
есть 2000+ элементов которые нужно последовательно обработать, нужно сделать так, что если обработка элемента длится более 1 секунды - обработку нужно прервать и вывести сообщение в лог и естественно продолжить обрабатывать другие элементы.


Сейчас у меня только 2 идеи, но они мне не нравятся:
1. самая примитивная - делать поток под каждую обработку и следить за потоком
2. сделать 1 поток обработки с очередью, 1 поток главный который будет следить за показателями очереди обработки и в случае чего останавливать его и перезапускать. - Но как это правильно сделать я еще полностью не представляю
 

PainKiller

Пастафарианец
Команда форуму
Супер Модератор

Это как вариант реализации таймаута.

Если последовательно, то стек или очередь

1. Многопоточная обработка непоследовательна сама по себе. Она параллельна.

И посмотри в сторону Map/Reduce.
 

Hamster

Well-Known Member
В чем собственно трудность задачи?
java.util.concurrent в помощь, все уже реализовано, и нужно написать 3 строчки типа

Код:
public class Main {

    public static void main(String[] args) {
        List<Element> tasks = new LinkedList<Element>();
        for (int i = 0; i < 20; i++) {//20 elements to test
            tasks.add(new Element(i));
        }
        ExecutorService service = Executors.newFixedThreadPool(10);//10threads in pool
        List<Future<String>> res = null;
        try {
            res = service.invokeAll(tasks, 2, TimeUnit.SECONDS);//2 sec for each task

        } catch (InterruptedException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }

        for (Future<String> r : res) {
            System.out.println(r.isCancelled());    //cancelled==out of time
        }

        service.shutdown();
    }
}

class Element implements Callable<String> {

    private int id = 0;

    public Element(int id) {
        this.id = id;
    }

    @Override
    public String call() {
        System.out.println("Call on id=" + id + ". Thread name: " + Thread.currentThread().getName());
        int x = (int) (Math.random() * 5);
        String s = "f;ikd;ajwd;kwa;d;a";
        for (long i = 0; i < 7 * x; i++) {
            s = s + new String(s.toUpperCase() + "fes").trim();  //long-time task ~2sec with different time
        }

        return "";
    }

}
Но можно и чуть по другому, используя executorService.submit и возвращающийся объект Future, отлавливая потом TimeoutException для каждого Element.
 

Cris

Member
спасибо за ответы, но я весь день не мог зайти на форум и сделал:
ExecutorService.execute(FutureTask);
и try
{
FutureTask.get(10,SECONDS);
}
catch(TimeoutException)...

и в этом случае, когда вылетает timeoutexception, ExecutorService нужно перезапустить, так как он terminated.
 
Зверху