使用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 本身的情况下控制线程?
使用 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;
}
}
}
}
我是 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 本身的情况下控制线程?
使用 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;
}
}
}
}