美文网首页
第一版本线程池-生产者消费者

第一版本线程池-生产者消费者

作者: 陈桐Caliburn | 来源:发表于2020-06-01 15:40 被阅读0次

用到知识点

1、shutdown 优雅关闭线程
2、notify wait 实现生产者消费者

/**
 * 线程池技术
 * @author chentong
 */
public class DefaultThreadPool<Job extends Runnable> implements ThreadPool<Job> {

    private static final int MAX_WORKER_NUM = 10;
    private static final int DEFAULT_WORKER_NUM = 5;
    private static final int MIN_WORKER_NUM = 1;

    private final List<Worker> workers = Collections.synchronizedList( new ArrayList<Worker>() );

    //lock同步
    private final Object lock = new Object();

    //原子变量操作
    private volatile AtomicInteger workerNum = new AtomicInteger( 0 );

    private final JobQueue<Job> queue = new JobQueue<>();

    public DefaultThreadPool() {
        addWorkers( DEFAULT_WORKER_NUM );
    }

    @Override
    public void execute(Job job) {
        if (job != null) {
            queue.enqueue( job );
        }
    }

    @Override
    public void addWorkers(int num) {

        synchronized (lock) {
            if (num + this.workerNum.get() > MAX_WORKER_NUM) {
                num = MAX_WORKER_NUM - this.workerNum.get();
                if (num <= 0) return;
            }

            for (int i = 0; i < num; i++) {
                Worker worker = new Worker( queue );
                workers.add( worker );
                Thread thread = new Thread( worker, "ThreadPool-Worker-" + workerNum.incrementAndGet() );
                thread.start();
            }
        }

    }

    @Override
    public void removeWorker(int num) {

        synchronized (lock) {
            //线程池最小线程数
            if (num >= this.workerNum.get()) {
                num = this.workerNum.get() - MIN_WORKER_NUM;
                if (num <= 0) return;
            }

            int count = 0;

            while (count < num) {

                Worker worker = workers.get( count );
                if (workers.remove( worker )) {
                    worker.shutdown();
                    count++;
                }
            }
            //减少线程
            workerNum.getAndAdd( -num );
        }

    }

    @Override
    public void shutdown() {
        synchronized (lock){
            for (Worker worker : workers) {
                worker.shutdown();
            }
            workers.clear();
        }
    }

    @Override
    public int getJobSize() {
        return queue.getJobSize();
    }

}

//优雅关闭线程
class Worker implements Runnable {

    private volatile boolean running = true;

    private JobQueue queue;

    public Worker(JobQueue queue) {
        this.queue = queue;
    }

    @Override
    public void run() {
        while (running) {
            Runnable job = queue.dequeue();
            if (job != null) {
                try {
                    job.run();
                } catch (Exception e) {
                }
            }
        }
    }

    public void shutdown() {
        running = false;
    }
}

//工作队列
//2、notify wait 实现生产者消费者
class JobQueue<Job extends Runnable> {

    private final LinkedList<Job> jobs = new LinkedList<>();

    private final Object lock = new Object();

    public void enqueue(Job job) {
        synchronized (lock) {
            lock.notifyAll();
            jobs.addLast( job );
        }
    }

    public Job dequeue() {

        synchronized (lock) {
            while (jobs.isEmpty()) {
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            Job job = jobs.removeFirst();
            return job;
        }
    }

    public int getJobSize() {
        synchronized (lock) {
            return jobs.size();
        }
    }

}

//线程池
interface ThreadPool<Job extends Runnable> {

    //执行job
    void execute(Job job);

    //关闭连接池
    void shutdown();

    //增加works
    void addWorkers(int num);

    //减少工作线程
    void removeWorker(int num);

    int getJobSize();

}

如何设置线程数

线程数的设定

相关文章

  • Java多线程基础三

    生产者消费者 线程池

  • 简易线程池的实现

    构成线程池的基本元素 线程池中的线程 任务队列 生产者 消费者 线程池 消费者 生产者 问题 任务队列的大小:如果...

  • 四、线程池及异步编程

    线程池ThreadPool 任务队列+多线程生产者-消费者模式 2、CompletionService,线程池+结...

  • 灯下黑?原来线程池是最典型生产消费者模式

    线程池:是生产者-消费者模型的典型应用。应用程序将任务交给线程池,线程池将其放入到BlockingQueue中。线...

  • 线程池(ThreadPoolExecutor)

    一:Executor知识点 二:线程池模型 1:线程池模型:生产者-消费者模式(与一般的池化资源模式不同),线程池...

  • 如何创建正确的线程池?

    线程是一个重量级的对象,应该避免频 繁创建和销毁。 线程池 线程池是一种生产者 - 消费者模式 为什么线程池没有采...

  • 并发编程-BlockQueue线程容器

    概述 blockQueue 作为线程容器、阻塞队列,多用于生产者、消费者的关系模式中,保障并发编程线程同步,线程池...

  • JAVA(四)回忆基础扫盲多线程

    一.多线程的小例子 } 四.构建线程池 五.消费者类 六.生产者类 } 七.定义执行函数类 }

  • 正确使用线程池

    线程池的设计采用生产者-消费者模式,如果把线程池类比为一个项目组,则线程是项目组的成员。线程池中的一些参数说明: ...

  • 2018-12-25 线程生产消费者模式

    原理: 建立一个公共的容器用来存放产品(产品池),生产者和消费者分别为单独的线程对产品池进行操作。为了保证线程的...

网友评论

      本文标题:第一版本线程池-生产者消费者

      本文链接:https://www.haomeiwen.com/subject/wradzhtx.html