从工作中返回值

import java.util.ArrayList;import java.util.concurrent.*;class TaskWithResult implements Callable<String> { //要想得到返回值能够实现Callable接口,类型参数是返回值的类型    private int id;    public TaskWithResult(int id) {        this.id = id; }    @Override    public String call() throws Exception { //实现call()办法,而不是run()        return "result of TaskWithResult" + id; }}public class CallableDemo {    public static void main(String[] args) {        ExecutorService exec = Executors.newCachedThreadPool();         ArrayList<Future<String>> results = new ArrayList<>(); //submit办法会产生Future对象        for (int i = 0; i < 10; i++) {            results.add(exec.submit(new TaskWithResult(i)));//必须应用ExectorService.submit()办法调用        }        for (Future<String> fs :                results) {            try {                System.out.println(fs.get()); //get()办法获取返回的后果,            } catch (InterruptedException e) {                System.out.println(e);                return;             } catch (ExecutionException e) {                System.out.println(e);            }finally {                exec.shutdown(); //敞开            }        }    }}
  • 能够应用Futrue对象的isDone()办法来查问Futrue是否已实现
  • 也能够间接调用get(),get()办法会等到后果就绪后调用

优先级

import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class SimplePriorities implements Runnable{    private int countDown = 5; private volatile double d; private int priority; public SimplePriorities(int priority) {        this.priority = priority; }    public String toString(){        return Thread.currentThread()+"优先级:"+priority + "计数" + ":"+countDown; }    @Override     public void run() {            Thread.currentThread().setPriority(priority);            while (true) {                for (int i = 0; i < 100000; i++) {                    d += (Math.PI + Math.E) / (double) i;                    if (i%1000==0) Thread.yield();                }            System.out.println(this);            if (--countDown==0) return;            }     }    public static void main(String[] args) {        ExecutorService exec = Executors.newCachedThreadPool();        for (int i = 0; i < 5; i++) {            exec.execute(new SimplePriorities(Thread.MIN_PRIORITY));        }        exec.execute(new SimplePriorities(Thread.MAX_PRIORITY));        exec.shutdown(); }}