JAVA线程池 newSingleThreadExecutor,newFixedThreadPool,newCachedThreadPool,newScheduledThreadPool(一)

线程池
1. newSingleThreadExecutor
    创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。

package com.zhiku;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 线程顺序执行的几种方式
 */
public class ThreadTest{
    public static void main(String[] args) {
        test03();
    }
    /**
     * 第二种实现方式,sleep方式    相对于join更加繁琐,可能会出现问题,sleep
     */
    private static void test03() {
        Thread t1 = new Thread(new Runnable(){
            @Override
            public void run(){
                System.out.println(Thread.currentThread().getName() + "执行完成");
            }

        }, "子线程1");
        Thread t2 = new Thread(new Runnable(){
            @Override
            public void run(){
                System.out.println(Thread.currentThread().getName() + "执行完成");
            }

        }, "子线程2");
        Thread t3 = new Thread(new Runnable(){
            @Override
            public void run(){
                System.out.println(Thread.currentThread().getName() + "执行完成");
            }

        }, "子线程3");
        //三个线程顺序执行 第一种方案,单个线程池 顺序放入执行队列中
        ExecutorService executor = Executors.newSingleThreadExecutor();
        executor.submit(t3);
        executor.submit(t2);
        executor.submit(t1);
        //shutdown调用后,不可以再submit新的task,已经submit的将继续执行。
        //shutdownNow试图停止当前正执行的task,并返回尚未执行的task的list
        executor.shutdown();
    }
}



2.newFixedThreadPool
    创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。

package com.zhiku;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * Created by Administrator on 2019/3/11.
 */
public class FixedThreadPoolTest {
    private static AtomicInteger line = new AtomicInteger(0);

    //定长线程池,可控制线程最大并发数,超出的线程会在队列中等待
    static ExecutorService pool = Executors.newFixedThreadPool(100);

    public static int getLine() {
        return line.addAndGet(1);
    }

    public static void main(String[] args) throws InterruptedException{
        FixedThreadPoolTest.doFixedThreadPoolJob();
    }

    //(一)测试FixedThreadPool
    public static void doFixedThreadPoolJob() throws InterruptedException {
        for (int i = 0; i < 100; i++) {
            pool.execute(new Runnable() {
                @Override
                public void run() {
                    Integer num = FixedThreadPoolTest.getLine();
                    System.out.println("线程:" + Thread.currentThread().getName()+";line:"+num);
                }
            });
        }
        pool.shutdown();
        System.out.println("shutdown():启动一次顺序关闭,执行以前提交的任务,但不接受新任务。");
        //判断线程池中线程是否全部执行完毕(注意注意!!!!!!!!!!!!!!)
        while (true) {
            if (pool.isTerminated()) {
                System.out.println("所有的子线程都结束了!");
                break;
            }
            Thread.sleep(1000);
        }
    }
}

3. newCachedThreadPool
    创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,
那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。

4.newScheduledThreadPool

    创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。

你可能感兴趣的:(java)