Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.concurrent.*;
- import java.util.concurrent.atomic.AtomicBoolean;
- // Задача, которую рабочий поток должен выполнить
- class MyTask implements Callable<Integer>
- {
- int x, y;
- MyTask(int a, int b) { x = a; y = b; }
- // Неэффективная реализация алгоритма Евклида
- // поиска НОДа чисел x и y
- @Override
- public Integer call()
- {
- // Убедимся в том, что этот участок кода выполняется рабочим потоком
- System.out.printf("call метод, поток: %s\n", Thread.currentThread().getName());
- while (x != 0 && y != 0)
- {
- if (x > y) x -= y;
- else y -= x;
- }
- if (x > 0) return x;
- else return y;
- }
- }
- public class Main
- {
- public static void main(String[] args)
- {
- // Два потока: главный и рабочий
- ExecutorService threadPool = Executors.newSingleThreadExecutor();
- // Убедимся в том, что этот участок кода выполняется главным потоком
- System.out.printf("main метод, поток: %s\n", Thread.currentThread().getName());
- // Задача, которую должен выполнить рабочий поток
- final Future<?> future = threadPool.submit(new MyTask(1000000000, 1));
- try
- {
- // Даем право на решение задачи ровно 1 секунду
- System.out.printf("Ответ: %d\n", future.get(1, TimeUnit.SECONDS));
- }
- catch (TimeoutException e)
- {
- // Обрабатываем случай, когда задача выполняется дольше 1 секунды
- System.out.println("Превышено время ожидания :(");
- future.cancel(true);
- }
- catch (InterruptedException | ExecutionException e)
- {
- // Обрабатываем случай, когда рабочий поток приостановил работу, хотя не должен был
- System.out.println("Назапланированное прерывание работы рабочего потока 0_0");
- }
- // Завершение работы потоков
- threadPool.shutdown();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement