//. concurrency/Cal1ableDemo.java
import java.util concurrent.*;
import java.util.*,
class TaskWithResult implements Callable
private int id;
public TaskWithResult(int id) { this id = id.
}
public String call О {
return "результат TaskWithResult " + id;
}
}
public class CallableDemo {
public static void main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPoolО; ArrayList
new ArrayList results.add(exec submit(new TaskWithResult(i))); for(Future // Вызов get О блокируется до завершения; System.out.pri nt1n(fs.get()); } catch(InterruptedException e) { System.out.println(e). return; } catch(ExecutionException e) { System out println(e); } finally { exec.shutdown(); } } /* Output• результат TaskWithResult О результат TaskWithResult 1 результат TaskWithResult 2 результат TaskWithResult 3 результат TaskWithResult 4 результат TaskWithResult 5 результат TaskWithResult 6 результат TaskWithResult 7 результат TaskWithResult 8 результат TaskWithResult 9 *///:- Метод submit() создает объект Future, параметризованный по типу результата, возвращаемому Callable. Вы можете обратиться к Future с запросом isDone(), чтобы узнать, завершена ли операция. После завершения задачи и появления результата производится его выборка методом get(). Если get() вызывается без предварительной проверки isDone(), вызов блокируется до появления результата. Также можно вызвать get() с интервалом тайм-аута. Перегруженный метод Executors.callable() получает Runnable и выдает Callable. ExecutorService содержит методы для выполнения коллекций объектов Callable. Ожидание Другим способом управления вашими потоками является вызов метода sleep(), который переводит поток в состояние ожидания на заданное количество миллисекунд. Если в классе LiftOff заменить вызов yield() на вызов метода sleep(), будет получен следующий результат: //: concurrency/SleepingTask.java // Вызов sleepO для приостановки потока, import java.util.concurrent.*; public class SIeepingTask extends LiftOff { public void run() { try { while(countDown-- > 0) { System.out.pri nt(status()); // Старый стиль. // Thread.sleep(lOO); // Стиль Java SE5/6: TimeUnit MILLISECONDS.sieep(100); } } catchdnterruptedException e) { System.err.pri ntin("Interrupted"); } } public static void main(String[] args) { ExecutorService exec = Executors.newCachedThreadPoolО; for(int i = 0; i < 5; i++) exec.execute(new SIeepi ngTask()); exec.shutdownO; } #0(9). #1(9) #2(7). #3(7) #4(5). #0(4) #1(2). #2(2) #1(Liftoff") */// _ #2(9). #3(9) #4(7). #0(6) #1(4). #2(4) #3(2). #4(2) #2(Liftoff!) #4(9). #0(8) #1(6). #2(6) #3(4). #4(4) #0(1). #1(1) #3(Liftoff!) #1(8). #2(8) #3(6). #4(6) #0(3). #1(3) #2(1). #3(1) #4(Liftoff!) #3(8). #4(8). #0(7). #1(7). #0(5). #1(5). #2(5). #3(5). #2(3). #3(3). #4(3). #0(2). #4(1). #0(Liftoff>1). Вызов метода sleep() может привести к исключению InterruptedException; перехват этого исключения продемонстрирован в run(). Поскольку исключения не распространяются по потокам обратно в main(), вы должны локально обработать любые исключения, возникающие внутри задачи.