Executors.newCacheThreadPool():可缓存线程池,先查看池中有没有以前建立的线程,如果有,就直接使用。如果没有,就建一个新的线程加入池中,缓存型池子通常用于执行一些生存期很短的异步型任务。

Executors.newFixedThreadPool(int n):创建一个可重用固定个数的线程池,以共享的无界队列方式来运行这些线程。

Executors.newScheduledThreadPool(int n):创建一个定长线程池,支持定时及周期性任务执行。

Executors.newSingleThreadExecutor():创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

// 创建一个可缓存的线程池 使用Callable方式创建线程
@org.junit.Test
    public void dxc() throws ExecutionException, InterruptedException {
        ExecutorService service = Executors.newCachedThreadPool();
        Future<Object> submit = service.submit(new Callable<Object>() {
            @Override
            public Object call() throws Exception {
//                int i = 0;
//                for (; i < 5; i++) {
//                    System.out.println(Thread.currentThread().getName() + "线程1 .....");
//                    System.out.println(i);
//                    Thread.sleep(1000);
//                }
//                return i;
                System.out.println(Thread.currentThread().getName() +" 111111");
                return 1;
            }
        });
        Future<Object> submit2 = service.submit(new Callable<Object>() {
            @Override
            public Object call() throws Exception {
//                int i = 5;
//                for (; i < 10; i++) {
//                    System.out.println(Thread.currentThread().getName() + "线程2 .....");
//                    System.out.println(i);
//                    Thread.sleep(1000);
//                }
//                return i;
                System.out.println(Thread.currentThread().getName() + " 222222 .....");
                return 2;
            }
        });
        service.shutdown(); 

        Integer i1 = (Integer) submit.get();
        Integer i2 = (Integer) submit2.get();
        System.out.println(i1);
        System.out.println("===================================");
        System.out.println(i2);
    }


// 创建一个固定数量的线程池 使用Runnable方式创建线程
@org.junit.Test
public void dxc2() {
    ExecutorService service = Executors.newFixedThreadPool(5);
    for (int i = 0; i < 5; i++) {
        service.execute(new test3());
        System.out.println("************* " + i + " *************");
    }
    service.shutdown();
}

public class test3 implements Runnable {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + "线程被调用了。");
        while (true) {
            try {
                Thread.sleep(5000);
                System.out.println(Thread.currentThread().getName());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

submit和execute区别:前者有返回值,使用get获取,后者没有返回值。

Callable只能使用submit;

Runnable可以使用submit和execute,使用submit获取的值为null;

Last modification:July 26th, 2019 at 08:34 pm