ExecutorService
package one; import java.util.concurrent.Callable; public class Task implements Callable<Integer> { private int type; public Task(int type) { this.type = type; } @Override public Integer call() throws Exception { if (1 == type) { try { Thread.sleep(5000); } catch (Exception e) { e.printStackTrace(); } return 1; } else if (2 == type) { try { Thread.sleep(20000); return 2; } catch (Exception e) { System.out.println("xxxxxxxx"); e.printStackTrace(); } return -2; } else if (3 == type) { throw new Exception("sxsxsx"); } return -1; } }
package one; public class MyThread extends Thread { private int type; public MyThread(int type) { this.type = type; } @Override public void run() { System.out.println("MyThread run() type:" + type); } }
package one; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class Bleach { public static void main(String[] args) { Task task1 = new Task(1); Task task2 = new Task(2); Task task3 = new Task(3); MyThread thread = new MyThread(4); ExecutorService es = Executors.newFixedThreadPool(1); try { Future<Integer> future1 = es.submit(task1); System.out.println("begin task1 run"); // 获得第一个任务的结果,如果调用get方法,当前线程会等待任务执行完毕后才往下执行 System.out.println(future1.get()); System.out.println("end task1 run\n"); // --------------------------------------- Future<Integer> future2 = es.submit(task2); System.out.println("begin first task2 run"); try { // sleep to wait the task2 to run Thread.sleep(1000); System.out.println("after sleep"); } catch (Exception e) { e.printStackTrace(); } boolean result = future2.cancel(true); System.out.println("task2 to cancel"); if (!result) { System.out.println(future2.get()); } System.out.println("end first task2 run"); // --------------------------------------- Future<Integer> future3 = es.submit(task3); System.out.println("begin first task3 run"); System.out.println(future3.get()); System.out.println("end first task3 run"); // --------------------------------------- // As to run(), returned value is null, it means has no returned // value es.submit(thread); } catch (InterruptedException | ExecutionException e) { System.out.println("Here is an Exception:"); e.printStackTrace(); } System.out.println("111111"); // after call shutdown, it will not receive new task. After all tasks // are finished, thread pool will exit. es.shutdown(); // try to shutdown now, if has task, it will try to stop it and // shutdown, but may not successfully. // es.shutdownNow(); System.out.println("2222222"); } }
begin task1 run
1
end task1 run
begin first task2 run
after sleep
task2 to cancel
end first task2 run
xxxxxxxx
begin first task3 run
java.lang.InterruptedException: sleep interrupted
Here is an Exception:
at java.lang.Thread.sleep(Native Method)
at one.Task.call(Task.java:24)
at one.Task.call(Task.java:1)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
java.util.concurrent.ExecutionException: java.lang.Exception: sxsxsx
at java.util.concurrent.FutureTask.report(FutureTask.java:122)
at java.util.concurrent.FutureTask.get(FutureTask.java:188)
at one.Bleach.main(Bleach.java:46)
Caused by: java.lang.Exception: sxsxsx
at one.Task.call(Task.java:33)
at one.Task.call(Task.java:1)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
111111
2222222