专栏首页gfujava多线程的实现(创建一个线程池并且简单的使用)

java多线程的实现(创建一个线程池并且简单的使用)

什么时候用多线程?

image.png

程序执行结果:

image.png

先说一下此处的打印,第一个参数是当前线程名称,由于线程之间是异步执行,有的还没创建好,有的后来居上就执行完了,打印线程的名称会这样,第二个参数是优先级,默认都是5,第三个参数是线程组名称。

github地址:https://github.com/furtech/java_utils/blob/master/src/main/java/com/furtech/javautils/ThreadPool.java

package com.furtech.javautils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.LinkedBlockingQueue;

/**
 * @des 线程池的简单实现(可扩展)
 *
 * @author 719383495@qq.com | 719383495qq@gmail.com | 有问题可以邮箱或者github联系我
 * @date 2019/8/4 13:55
 */
public class ThreadPool {
    /**@des logger */
    private static final Logger logger = LoggerFactory.getLogger(ThreadPool.class);
    private final int poolSize;
    private final LinkedBlockingQueue queue;
    private final PoolWorker[] runable;

    public ThreadPool(int poolSize) {
        this.poolSize = poolSize;
        queue = new LinkedBlockingQueue();
        runable = new PoolWorker[poolSize];
        for (int i = 0; i < poolSize; i++) {
            runable[i] = new PoolWorker();
            new Thread(runable[i], "pool-" + i).start();
        }
    }

    public void execute(Runnable task) {
        synchronized (queue) {
            queue.add(task);
            queue.notify();
        }
    }

    private class PoolWorker implements Runnable {
        @Override
        public void run() {
            Runnable task ;

            while (true) {
                synchronized (queue) {
                    while (queue.isEmpty()) {
                        try {
                            queue.wait();
                        } catch (Exception e) {
                            logger.info("exception in queue waiting :{}",e.getMessage());
                        }
                    }
                    task = (Runnable) queue.poll();
                }
                try {
                    task.run();
                } catch (RuntimeException e) {
                    logger.info("run exception : {}", e.getMessage());
                }

            }
        }
    }

}

class ThreadPoolMain {
    public static void main(String[] args) {
        ThreadPool pool = new ThreadPool(5);
        int MaxSize = 100;
        for (int i = 0; i < MaxSize; i++) {
            pool.execute(() -> System.out.println(Thread.currentThread()));
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=39wh3ifp3dkws

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • spring中如何注入的

    不知道你们有没有想过这个问题,spring在注入的过程中,到底是注入的是接口还是实现类 在开发过程中,有些地方有些迷惑,我们也没有过多的去思考,接下来简单的说...

    gfu
  • 泛型

    gfu
  • mybatis-plus的使用

    多表的分页只需要在Mapper里的方法中传入Page这个对象就可以自动分页了,mybatis-plus是基于mybatis,也要引入对应的包。本项目是基于gra...

    gfu
  • C# 从零开始写 SharpDx 应用 控制台创建 Sharpdx 窗口 下载创建窗口

    本文告诉大家如何在控制台使用 SharpDx 创建窗口,这是一个底层的博客,我会用很多博客告诉大家如何从控制台创建一个高性能渲染程序

    林德熙
  • 关于ADAS系统小记

    ADAS(Advanced Driving Assistant System)高级驾驶辅助系统是利用安装在车上的各式各样传感器(毫米波雷达、激光雷达、单\双目摄...

    李小白是一只喵
  • C# 对mysql的操作全记录.

    Tuesday
  • OpenAI人工智能1v1击败Dota2最强玩家:明年开启5v5模式

    机器之心报道 参与:路雪、李亚洲、黄小天 计算机已经在国际象棋和围棋等经典游戏中打败世界上最厉害的人类。现在又有一台计算机在 Valve 举办的 Dota2 国...

    机器之心
  • OpenAI人工智能1v1击败Dota2最强玩家:明年开启5v5模式

    在 Dota2 一对一表演赛中,由 OpenAI 设计的 bot 打败了 Danylo "Dendi" Ishutin,一名在职业生涯中已经赢得 735,449...

    华章科技
  • Python3.6 下 安装MySql

    听着music睡
  • 简单明了,有史以来最强的5G入门科普!

    这是一个既简单又神奇的公式。说它简单,是因为它一共只有3个字母。而说它神奇,是因为这个公式蕴含了博大精深的通信技术奥秘,这个星球上有无数的人都在为之魂牵梦绕。

    用户6543014

扫码关注云+社区

领取腾讯云代金券