使用ExecutorService控制线程执行时间

Use ExecutorService to control thread execution time

我是 Java 并发包的新手,想尝试 ExecutorService 来控制线程的执行时间。

所以对于保持 运行 线程 MyThread,我想使用 ExecutorService 和 Future class 在 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 class 本身的情况下控制线程?

使用returned Future对象进行控制。

使用 ExecutorService 的主要目的是 隐藏 线程是如何为程序员创建、重用和管理的。

您需要实现 Runnable:

而不是创建 MyThread
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;
      }
    }
  }
}