日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

高并发编程-自定义简易的线程池(1),体会原理

發(fā)布時(shí)間:2025/3/21 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 高并发编程-自定义简易的线程池(1),体会原理 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 概述
  • 示例

概述

我們工作中,并發(fā)編程必然離不開(kāi)jdk提供的j.u.c中的線(xiàn)程池 ,假設(shè)讓我們自己去設(shè)計(jì)一個(gè)線(xiàn)程池,該從哪幾個(gè)方面來(lái)著手考慮呢?

首先: 既然是線(xiàn)程池 , 那必然 有個(gè)初始化的線(xiàn)程數(shù)量 和 最大數(shù)量 ----> 兩個(gè)屬性 : init 和 max

其次:當(dāng)線(xiàn)程池中的線(xiàn)程達(dá)到了 init 數(shù)量,但還沒(méi)到max 數(shù)量的時(shí)候,將任務(wù)放入任務(wù)隊(duì)列中,而不是直接開(kāi)辟新的線(xiàn)程,是不是一種更好的設(shè)計(jì)? 所以 引入 任務(wù)隊(duì)列,存放任務(wù)

最后:當(dāng)線(xiàn)程池中的線(xiàn)程 把 任務(wù)隊(duì)列也塞滿(mǎn)了,也達(dá)到了Max的值,新的線(xiàn)程過(guò)來(lái),我們改如何處理呢? 是不是指定拒絕策略更合適呢? 比如 直接拒絕,拋出異常,放入臨時(shí)隊(duì)列等等。所以 拒絕策略也是需要的

總結(jié)一下

  • init (coreSize) / max , 線(xiàn)程池初始化大小和最大線(xiàn)程數(shù)
  • 任務(wù)隊(duì)列
  • 拒絕策略
  • 。。。

  • 示例

    逐步實(shí)現(xiàn)該需求, 先把基本的流程調(diào)通,這里我們先實(shí)現(xiàn)定義線(xiàn)程池?cái)?shù)量的功能 ,代碼如下

    package com.artisan.test;import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.stream.IntStream;public class SimpleThreadPool {// 線(xiàn)程數(shù)private int size;// 默認(rèn)線(xiàn)程數(shù)private static int DEFAULT_SIZE = 10;// 任務(wù)隊(duì)列private final static LinkedList<Runnable> TASK_QUEUE = new LinkedList();// 工作線(xiàn)程集合private final static List<WorkTask> THREAD_QUEUE = new ArrayList<>();private static volatile int seq = 0;private static final ThreadGroup GROUP = new ThreadGroup("Pool_Group");private static final String THREAD_PREFIX = "SIMPLE_THREAD_POOL-";/*** 默認(rèn)構(gòu)造函數(shù)* 默認(rèn)10個(gè)線(xiàn)程*/public SimpleThreadPool() {this(DEFAULT_SIZE);}/*** 線(xiàn)程池中的線(xiàn)程數(shù)量** @param size*/public SimpleThreadPool(int size) {this.size = size;// 初始化init();}/*** 初始化*/private void init() {for (int i = 0; i < size; i++) {createWorkTask();}}/*** 創(chuàng)建工作線(xiàn)程*/private void createWorkTask() {// 創(chuàng)建工作線(xiàn)程WorkTask workTask = new WorkTask(GROUP, THREAD_PREFIX + (seq++));// 啟動(dòng)workTask.start();// 加入到工作線(xiàn)程集合THREAD_QUEUE.add(workTask);}/*** 將任務(wù)runnable 提交到 TASK_QUEUE** @param runnable*/public void submit(Runnable runnable) {synchronized (TASK_QUEUE) {// 添加到隊(duì)列的最后面TASK_QUEUE.addLast(runnable);// 喚醒所有正在等待的線(xiàn)程TASK_QUEUE.notifyAll();}}/*** 線(xiàn)程狀態(tài)*/enum TaskState {FREE,RUNNING,BLOCKED,DEAD}/*** private 私有類(lèi)* 繼承Thread 的 工作線(xiàn)程*/private static class WorkTask extends Thread {// 默認(rèn)狀態(tài) FREEprivate volatile TaskState state = TaskState.FREE;public WorkTask(ThreadGroup threadGroup, String name) {super(threadGroup, name);}/*** 獲取線(xiàn)程狀態(tài)** @return*/public TaskState getTaskState() {return this.state;}/*** 重寫(xiě)run方法*/@Overridepublic void run() {// 跳出while的標(biāo)識(shí)OUTER:// 只要不是DEAD 狀態(tài),一直從隊(duì)列中獲取消息while (state != TaskState.DEAD) {Runnable runnable;// 對(duì)隊(duì)列進(jìn)行加鎖操作synchronized (TASK_QUEUE) {// 如果隊(duì)列為空,waitwhile (TASK_QUEUE.isEmpty()) {try {// 更改狀態(tài)state = TaskState.BLOCKED;// wait 放棄該鎖TASK_QUEUE.wait();} catch (InterruptedException e) {// 如果有個(gè)線(xiàn)程在wait,終止該線(xiàn)程會(huì)被InterruptedException異常捕獲,// break OUTER 跳出while循環(huán),從而達(dá)到終止這個(gè)線(xiàn)程break OUTER;}}// TASK_QUEUE不為空 從隊(duì)列中獲取一個(gè)Runnable對(duì)象// Removes and returns the first element from this listrunnable = TASK_QUEUE.removeFirst();}if (runnable != null) {// 運(yùn)行狀態(tài)state = TaskState.RUNNING;// 運(yùn)行runnable.run();// 運(yùn)行結(jié)束后 置為FREEstate = TaskState.FREE;}}}/*** 關(guān)閉線(xiàn)程*/public void close() {this.state = TaskState.DEAD;}}/*** 測(cè)試** @param args*/public static void main(String[] args) {SimpleThreadPool simpleThreadPool = new SimpleThreadPool(); // for (int i = 0; i < 50; i++) { // simpleThreadPool.submit(()->{ // try { // System.out.println(Thread.currentThread().getName() + " is running" ); // Thread.sleep(1_000); // System.out.println(Thread.currentThread().getName() + " finished" ); // } catch (InterruptedException e) { // e.printStackTrace(); // } // }); // }IntStream.range(0, 50).forEach(i ->simpleThreadPool.submit(() -> {try {System.out.println(Thread.currentThread().getName() + "____" + i + " start");Thread.sleep(1_000);System.out.println(Thread.currentThread().getName() + "____" + i +" finished");} catch (InterruptedException e) {e.printStackTrace();}}));} }

    運(yùn)行:

    SIMPLE_THREAD_POOL-9____0 start SIMPLE_THREAD_POOL-4____5 start SIMPLE_THREAD_POOL-0____9 start SIMPLE_THREAD_POOL-5____4 start SIMPLE_THREAD_POOL-6____3 start SIMPLE_THREAD_POOL-8____1 start SIMPLE_THREAD_POOL-7____2 start SIMPLE_THREAD_POOL-1____8 start SIMPLE_THREAD_POOL-3____6 start SIMPLE_THREAD_POOL-2____7 start SIMPLE_THREAD_POOL-4____5 finished SIMPLE_THREAD_POOL-6____3 finished SIMPLE_THREAD_POOL-5____4 finished SIMPLE_THREAD_POOL-3____6 finished SIMPLE_THREAD_POOL-0____9 finished SIMPLE_THREAD_POOL-9____0 finished SIMPLE_THREAD_POOL-0____13 start SIMPLE_THREAD_POOL-2____7 finished SIMPLE_THREAD_POOL-5____12 start SIMPLE_THREAD_POOL-1____8 finished SIMPLE_THREAD_POOL-6____11 start SIMPLE_THREAD_POOL-7____2 finished SIMPLE_THREAD_POOL-4____10 start SIMPLE_THREAD_POOL-8____1 finished SIMPLE_THREAD_POOL-7____17 start SIMPLE_THREAD_POOL-1____16 start SIMPLE_THREAD_POOL-2____15 start SIMPLE_THREAD_POOL-9____14 start SIMPLE_THREAD_POOL-8____18 start SIMPLE_THREAD_POOL-3____19 start SIMPLE_THREAD_POOL-0____13 finished SIMPLE_THREAD_POOL-0____20 start SIMPLE_THREAD_POOL-5____12 finished SIMPLE_THREAD_POOL-5____21 start SIMPLE_THREAD_POOL-6____11 finished SIMPLE_THREAD_POOL-6____22 start SIMPLE_THREAD_POOL-4____10 finished SIMPLE_THREAD_POOL-4____23 start SIMPLE_THREAD_POOL-7____17 finished SIMPLE_THREAD_POOL-7____24 start SIMPLE_THREAD_POOL-1____16 finished SIMPLE_THREAD_POOL-1____25 start SIMPLE_THREAD_POOL-2____15 finished SIMPLE_THREAD_POOL-2____26 start SIMPLE_THREAD_POOL-9____14 finished SIMPLE_THREAD_POOL-9____27 start SIMPLE_THREAD_POOL-8____18 finished SIMPLE_THREAD_POOL-8____28 start SIMPLE_THREAD_POOL-3____19 finished SIMPLE_THREAD_POOL-3____29 start SIMPLE_THREAD_POOL-5____21 finished SIMPLE_THREAD_POOL-2____26 finished SIMPLE_THREAD_POOL-1____25 finished SIMPLE_THREAD_POOL-7____24 finished SIMPLE_THREAD_POOL-4____23 finished SIMPLE_THREAD_POOL-0____20 finished SIMPLE_THREAD_POOL-6____22 finished SIMPLE_THREAD_POOL-0____35 start SIMPLE_THREAD_POOL-4____34 start SIMPLE_THREAD_POOL-7____33 start SIMPLE_THREAD_POOL-1____32 start SIMPLE_THREAD_POOL-8____28 finished SIMPLE_THREAD_POOL-3____29 finished SIMPLE_THREAD_POOL-2____31 start SIMPLE_THREAD_POOL-9____27 finished SIMPLE_THREAD_POOL-5____30 start SIMPLE_THREAD_POOL-9____39 start SIMPLE_THREAD_POOL-3____38 start SIMPLE_THREAD_POOL-8____37 start SIMPLE_THREAD_POOL-6____36 start SIMPLE_THREAD_POOL-8____37 finished SIMPLE_THREAD_POOL-2____31 finished SIMPLE_THREAD_POOL-5____30 finished SIMPLE_THREAD_POOL-3____38 finished SIMPLE_THREAD_POOL-9____39 finished SIMPLE_THREAD_POOL-6____36 finished SIMPLE_THREAD_POOL-9____44 start SIMPLE_THREAD_POOL-0____35 finished SIMPLE_THREAD_POOL-4____34 finished SIMPLE_THREAD_POOL-3____43 start SIMPLE_THREAD_POOL-4____47 start SIMPLE_THREAD_POOL-7____33 finished SIMPLE_THREAD_POOL-7____48 start SIMPLE_THREAD_POOL-5____42 start SIMPLE_THREAD_POOL-1____32 finished SIMPLE_THREAD_POOL-2____41 start SIMPLE_THREAD_POOL-8____40 start SIMPLE_THREAD_POOL-1____49 start SIMPLE_THREAD_POOL-0____46 start SIMPLE_THREAD_POOL-6____45 start SIMPLE_THREAD_POOL-3____43 finished SIMPLE_THREAD_POOL-5____42 finished SIMPLE_THREAD_POOL-7____48 finished SIMPLE_THREAD_POOL-4____47 finished SIMPLE_THREAD_POOL-9____44 finished SIMPLE_THREAD_POOL-6____45 finished SIMPLE_THREAD_POOL-0____46 finished SIMPLE_THREAD_POOL-1____49 finished SIMPLE_THREAD_POOL-8____40 finished SIMPLE_THREAD_POOL-2____41 finished

    可知: 雖然定義了50個(gè)任務(wù),但是根據(jù)日志來(lái)看,是由10個(gè)線(xiàn)程來(lái)完成的,符合預(yù)期。

    總結(jié)

    以上是生活随笔為你收集整理的高并发编程-自定义简易的线程池(1),体会原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。