March, 2011


28
Mar 11

Ruthless but Fair Task Executor

Facebook executionGoal: To implement fair mechanism for execution of tasks in parallel with fair usage of resources by each task.
Proposed implementation is going to be ruthless so as fairly long running tasks will be simply killed, so they don’t block execution of other tasks in the queue.






Ingridients: WatchedFutureTask – a monitored task, which should rather be nimble and swift.

public class WatchedFutureTask extends FutureTask<Object> {
    private long startTime;

    public WatchedFutureTask(Runnable runnable) {
        super(runnable, null);
    }
   
    public void run() {
        startTime = System.currentTimeMillis();
        super.run();
    }

    public boolean isTimedOut(int timeout) {
        return !isCancelled() && !isDone() && System.currentTimeMillis() > (startTime + timeout);
    }
}

TaskMonitor – the ruthless and thread-safe killer.

public class TaskMonitor extends Thread {
    private final Queue<WatchedFutureTask> runningTasks = new ConcurrentLinkedQueue<WatchedFutureTask>();
    private final long timeout;

    public TaskMonitor(long timeout) {
        super();
        this.timeout = timeout;
    }

    public void watch(WatchedFutureTask task) {
        runningTasks.add(task);
    }

    public void run() {
        while (!isInterrupted()) {
            for (Iterator<WatchedFutureTask> it = runningTasks.iterator(); it.hasNext();) {
                WatchedFutureTask task = it.next();
                if (task.isTimedOut(timeout)) task.cancel(true);
                if (task.isDone() || task.isCancelled()) it.remove();
            }
            try {
                Thread.sleep(5000); // run every 5 second
            } (InterruptedException e) {
                // should exit naturally
            }
        }
    }
}

ExecutorService provided by java.util.concurrent package.
And now putting it all together we have got TaskExecutor:

public class TaskExecutor {
    private TaskMonitor monitor;
    private ExecutorService executor;

    public TaskExecutor(int threadPoolSize, long taskTimeout) {
        ExecutorService executor = Executors.newFixedThreadPool(threadPoolSize);
        monitor = new TaskMonitor(taskTimeout);
        monitor.start();
    }

    public void submit(Runnable task) {
        WatchedFutureTask wtask = new WatchedFutureTask(task);
        executor.execute(wtask);
        monitor.watch(wtask);
    }
}

Leveraging capability of Future to hold task execution result (of type T), we could eloborate and arrange collection of the tasks execution results. To achieve this, you would replace usages of Runnable with usages of Callable and implement appropriate logic to store the outcomes.


10
Mar 11

Веришь? или Не Веришь?

Spill the beans Вот уже немного больше двух месяцев ведётся работа над новым сервисом ВеНеВе.ру (“Верю! Не Верю!”). Я решил написать о нём, так как мы делаем хороший прогрес, и версия 1.0 бета уже скоро увидит свет.

Немного о самом сервисе и его цели. Проект несёт две связанные между собой миссии: 1) свободное участие в развитии событий вокруг нас и 2) повышение качества и достоверности информации в Интернете.

Каждый задаётся резонным вопросом (мы тоже им задавались): Как пользователи могут участвовать?.. Ок, если совсем просто, то на сайте это участие выражено простым выбором и нажатием на кнопку “Верю!” или кнопку “Не верю!“. Если немного сложнее, то здесь замешана интуиция: интуиция никогда не подводит, в отличие от логических рассуждений. Также слово “верю” – это выражение интуиции, в отличие от “знаю” (как можно наверняка знать, что будет в даже очень близком будущем?), и таким образом, оно несёт в себе, если могу так выразиться, личное отношение каждого из вас к куску информации или интуитивное знание. Те, кто, сейчас читая, приписывают мистику этому процесу (и думают “что за бред он тут пишет!?”), уже выражают своё мнение через “не верю“…

Говоря о достоверности и качестве информации, я НЕ имею в виду известные или “справочные” данные, а скорее информацию, сложно проверяемую или связанную с событиями в будущем (через час или завтра – это тоже будущее). К тому же разные новостные сайты могут подавать информацию по-разному, с разной степенью достоверности (дайте знать, оставив комментарий, если Вы верите/не верите в то, что я только что написал).

Конечно, сайт не будет состоять только из двух кнопок… Мы стараемся сделать его максимально интуитивным, удобным и полезным, и мы захотим услышать ваше мнение!

Вот я и, как говорится, пролил немного бобов, а вам решать верить или не верить. :)