java-threadpool

2019-07-12  本文已影响0人  jianshuqiang

线程池的好处

利用线程池管理多线程可以控制最大并发的问题,同时可以只能加服务器资源的利用率

线程池的简单使用

1,线程池管理类

package com.learn.test.demo.ThreadPoolExample;

import javax.annotation.security.RunAs;
import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.*;

public class ThreadPoolManager {
    private static ThreadPoolManager tpm = new ThreadPoolManager();
    //可执行线程数为MAX_POOL_SIZE+WORK_QUEUE_SIZE=320
    // 线程池维护线程的最少数量
    private final static int CORE_POOL_SIZE = 33;
    // 线程池维护线程的最大数量
    private final static int MAX_POOL_SIZE = 300;
    // 线程池维护线程所允许的空闲时间
    private final static int KEEP_ALIVE_TIME = 100;
    // 线程池所使用的缓冲队列大小
    private final static int WORK_QUEUE_SIZE = 20;
    // 消息缓冲队列,当当前线程数>(最大线程数+队列中线程数)的时候将加入到这个队列中
    Queue<ThreadJob> msgQueue = new LinkedList<ThreadJob>();

    public static ThreadPoolManager newInstance() {
        return tpm;
    }

    //判断任务队列是否为空
    private boolean hasMoreAcquire() {
        return !msgQueue.isEmpty();
    }

    //将对于的线程放到另外一个队列中
    final RejectedExecutionHandler handler = new RejectedExecutionHandler() {
        // 进行重新入队
        @Override
        public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
            System.out.println(((ThreadJob) r).getThreaeName() + "消息放入队列中重新等待执行");
            msgQueue.offer(((ThreadJob) r));
        }
    };
    // 线程池
    final ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
            CORE_POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME,
            TimeUnit.MILLISECONDS, new ArrayBlockingQueue(WORK_QUEUE_SIZE),
            this.handler);
    //可以用来处理多余线程
    final Runnable runnable = new Runnable() {
        @Override
        public void run() {
            System.out.println("管理线程池中线程启动");
            if (hasMoreAcquire()) {
                System.out.println("开始分析分析队列中的数据");
                ThreadJob threadJob = msgQueue.poll();
                System.out.println(threadJob.getThreaeName());
            }

        }
    };

    public void addThread(String threadName) {
        Runnable task;
        try {
            task = new ThreadJob(threadName);
            threadPool.execute(task);
        } catch (Exception e) {


        }
    }

    // 管理数据库访问的线程池


    // 调度线程池
    final ScheduledExecutorService scheduler = Executors
            .newScheduledThreadPool(1);
    //从现在开始每350毫秒执行一次,执行的是奔类中的run方法
    final ScheduledFuture taskHandler = scheduler.scheduleAtFixedRate(
            runnable, 0, 350, TimeUnit.MILLISECONDS);
}

2,线程类

package com.learn.test.demo.ThreadPoolExample;

public class ThreadJob implements Runnable {
    private String threaeName;

    public ThreadJob(String threaeName) {
        this.threaeName = threaeName;
    }

    public String getThreaeName() {
        return threaeName;
    }

    public void setThreaeName(String threaeName) {
        this.threaeName = threaeName;
    }

    @Override
    public void run() {
        System.out.println("开始执行 ThreadJob--> run");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(this.threaeName);

    }
}

3,测试类

package com.learn.test.demo.ThreadPoolExample;

public class TestThreadPool {
    public static void main(String[] args) {
        ThreadPoolManager threadPoolManager=ThreadPoolManager.newInstance();
        for (int i = 0; i < 1000; i++) {
            threadPoolManager.addThread("hello threadpool-->"+i);
            System.out.println("线程队列中的数据:"+  threadPoolManager.msgQueue.size());
        }


    }
}

上一篇下一篇

猜你喜欢

热点阅读