2014-11-18 6 views
0

У меня есть метод, следующий Runnable.run():Java ThreadPoolExecutor релиз нить нить бассейн

public void run() { 
    calculateStuff(); 
    boolean ioSuccesful = IOforThisRunnable(); 
    while(!ioSuccesful) { 
     Thread.sleep(500); // alternative? 
     boolean ioSuccesful = IOforThisRunnable(); 
    } 
} 

Я хочу, чтобы выполнить этот код в ThreadPoolExecutor с максимальным числом потоков.

Теперь мой вопрос:

Пусть мой ThreadPool состоит из 5 нитей. В текущем примере 5 runnables блокируют выполнение для любых дополнительных потоков, поскольку Thread.sleep() не освобождает поток ?! (если IO не является успешным)

Есть ли способ освободить поток вместо Thread.sleep(), чтобы другие runnables могли запускаться, пока другой ожидает ввода-вывода?

Так что в худшем случае все runnables будут сидеть в цикле?

ответ

2

Если ваша работа ввода-вывода блокируется, тогда у вас нет выбора: поток должен сидеть в стеке, ожидая завершения ввода-вывода блокировки, чтобы поток не мог выполнять какую-либо другую работу ,

Вы хотите использовать неблокирующий ввод-вывод в сочетании с чем-то вроде Guava ListenableFuture. Это позволит вам сделать что-то вроде:

static ListenableFuture<Boolean> doIoWork() { 
    // ... 
} 

static ListenableFuture<Boolean> doIoWithRetry(
    ListeningExecutorService executor) { 
    SettableFuture<Boolean> finalResult = SettableFuture.create(); 
    calculateStuff(); 
    doIoWithRetry(executor, finalResult); 
    return finalResult; 
} 

private static void doIoWithRetry(
    final ListeningExecutorService executor, 
    final SettableFuture<Boolean> finalResult) { 
    final ListenableFuture<Boolean> pendingWork = doIoWork(); 
    pendingWork.addListener(new Runnable() { 
    @Override public void run() { 
     // pendingWork is now complete 
     // (error checking elided here) 
     boolean ioSuccessful = pendingWork.get(); 
     if (ioSuccessful) { 
     finalResult.set(true); 
     return; 
     } 
     doIoWithRetry(executor, finalWork); 
    } 
    }, executor); 
} 
+0

Знаете ли вы, может ли это быть достигнуто при использовании базовой библиотеки в java или scala? – eclipse

Смежные вопросы