2016-01-21 8 views
0

Я новичок в параллельном пакете Java и хочу попробовать ExecutorService контролировать время выполнения потока.Используйте ExecutorService для управления временем выполнения потока

Итак, для продолжения потока MyThread, я хочу использовать класс ExecutorService и Future, чтобы остановить его через 2 секунды.

public class MyThread extends Thread { 

    public static int count = 0; 

    @Override 
    public void run() { 
     while (true) { 
      System.out.println(count++); 
     } 
    } 
} 


public static void main(String[] args) throws IOException, InterruptedException { 
    ExecutorService executorService = Executors.newFixedThreadPool(1); 
    MyThread thread = new MyThread(); 
    FutureTask<String> futureTask = new FutureTask<String>(thread, "success"); 
    try { 
     executorService.submit(futureTask).get(2, TimeUnit.SECONDS); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (ExecutionException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (TimeoutException e) { 
     System.out.println("timeout"); 
     e.printStackTrace(); 
     executorService.shutdownNow(); 
    } 
} 

Тем не менее, поток по-прежнему сохраняет номера печати через 2 секунды. Как я могу контролировать поток без изменения самого класса MyThread?

+0

Вы написали бесконечный цикл для печати чисел. Код в этом классе должен быть изменен. –

+0

Я использую бесконечный цикл, чтобы увидеть, может ли ExecutorService остановить поток. –

ответ

0

Основная цель использования ExecutorService состоит в том, чтобы скрыть, как потоки создаются, используются повторно и в общем управляются программистом.

Вместо создания MyThread, необходимо реализовать Runnable:

public class MyRunnable implements Runnable { 
    private int count = 0; 
    public void run() { 
    while (true) { 
     System.out.println(count++); 
    } 
    } 
} 

И это было бы, как использовать его:

Future<Void> f = executorService.submit(new MyRunnable()); 
f.get(2, TimeUnit.SECONDS); 

Что касается собственности терминации в вопросе, пример Runnable не очень хороший, потому что он does not provide an interruptible task. Например, если добавлена ​​операция sleep:

public class MyRunnable implements Runnable { 
    private int count = 0; 
    public void run() { 
    while (!Thread.currentThread().isInterrupted()) { 
     System.out.println(count++); 
     try { 
     Thread.sleep(0, 1); 
     } catch (InterruptedException x) { 
     return; 
     } 
    } 
    } 
} 
+0

MyThread расширяет поток, который реализует Runnable. – rkosegi

+0

Резьба реализует Runnable. Я также попробовал ваш метод, Future f = executorService.submit (новый MyRunnable()); f.get (2, TimeUnit.SECONDS); Это все еще не работает. Поток все еще работает все время. –

+0

Может быть, неплохо прочитать немного о различии: http://stackoverflow.com/questions/541487/implements-runnable-vs-extends-thread – nobeh

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