huangruiwu

知识点:获取线程池、提交任务、获取返回值

 

获取线程池的几种方式:

newFixedThreadPool(int nThreads) 获取固定数量的线程池。参数:指定线程池中线程的数量。(使用这种)

newCachedThreadPool() 获得动态数量的线程池,如不够则创建新的,⽆上限。

newSingleThreadExecutor() 创建单个线程的线程池,只有⼀个线程。

newScheduledThreadPool() 创建固定⼤⼩的线程池,可以延迟或定时执⾏任务。

 

Callable:jdk1.5之后可以使用Callable来实现线程,这个类的call方法具有泛型返回值、可以声明异常。

Runnable接⼝和Callable接⼝的区别:

Callable接⼝中call⽅法有返回值,Runnable接⼝中run⽅法没有返回值。

Callable接⼝中call⽅法有声明异常,Runnable接⼝中run⽅法没有异常。

 

Future接⼝表示将要执⾏完任务的结果。 get()以阻塞形式等待Future中的异步处理结果(call()的返回值)。

 

案例1:使⽤两个线程,并发计算1~50、51~100的和,再进⾏汇总统计。

public class TestFuture2 {
    public static void main(String[] args) throws Exception{
        //1创建线程池
        ExecutorService es= Executors.newFixedThreadPool(2);
        //2提交任务
        Future<Integer> future1=es.submit(new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                int sum=0;
                for(int i=1;i<=50;i++) {
                    sum+=i;
                }
                System.out.println("1-50计算完毕");
                return sum;
            }
        });

        Future<Integer> future2=es.submit(new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                int sum=0;
                for(int i=51;i<=100;i++) {
                    sum+=i;
                }
                System.out.println("51-100计算完毕");
                return sum;
            }
        });
        //3获取结果
        int sum=future1.get()+future2.get();
        System.out.println("结果是:"+sum);
        //4关闭线程池
        es.shutdown();
    }
}

 

相关文章: