kotlin 线程池封装

package com.example.roomstudy.threadpool.threadpool3

import android.util.Log

import java.util.concurrent.*

import kotlin.coroutines.CoroutineContext

import kotlinx.coroutines.*

import java.util.concurrent.atomic.AtomicInteger

/** deepseek

  • 线程池管理工具类

  • 支持任务调度、暂停、取消等操作

    */

    class ThreadPoolManager private constructor(builder: Builder) {

    // region 配置参数

    private val corePoolSize: Int

    private val maxPoolSize: Int

    private val keepAliveTime: Long

    private val workQueue: BlockingQueue

    private val threadFactory: ThreadFactory

    private val exceptionHandler: ((Thread, Throwable) -> Unit)?

    // endregion

    // region 核心组件

    private val executor: ThreadPoolExecutor

    val coroutineDispatcher: CoroutineContext

    internal val taskMap = ConcurrentHashMap<String, Future<*>>()

    // endregion

    init {

    corePoolSize = builder.corePoolSize

    maxPoolSize = builder.maxPoolSize

    keepAliveTime = builder.keepAliveTime

    workQueue = builder.workQueue ?: LinkedBlockingQueue()

    threadFactory = builder.threadFactory ?: DefaultThreadFactory(builder.exceptionHandler)

    exceptionHandler = builder.exceptionHandler

    复制代码
     executor = ThreadPoolExecutor(
         corePoolSize,
         maxPoolSize,
         keepAliveTime,
         TimeUnit.MILLISECONDS,
         workQueue,
         threadFactory
     ).apply {
         allowCoreThreadTimeOut(builder.allowCoreThreadTimeout)
     }
    
     coroutineDispatcher = executor.asCoroutineDispatcher()

    }

    // region 预设模板

    companion object {

    /**

    * IO密集型任务配置(适合网络请求)

    */

    fun newIOThreadPool(): ThreadPoolManager {

    val cpuCount = Runtime.getRuntime().availableProcessors()

    return Builder().apply {

    corePoolSize = cpuCount * 2

    maxPoolSize = cpuCount * 4

    keepAliveTime = 30L

    workQueue = LinkedBlockingQueue(128)

    }.build()

    }

    复制代码
     /**
      * CPU密集型任务配置(适合数据库操作)
      */
     fun newCPUThreadPool(): ThreadPoolManager {
         val cpuCount = Runtime.getRuntime().availableProcessors()
         return Builder().apply {
             corePoolSize = cpuCount + 1
             maxPoolSize = cpuCount * 2
             keepAliveTime = 10L
             workQueue = LinkedBlockingQueue(64)
         }.build()
     }

    }

    // endregion

    // region 任务管理

    @Synchronized

    fun submit(tag: String, task: Runnable): Boolean {

    if (taskMap.containsKey(tag)) return false

    taskMap[tag] = executor.submit(wrapTask(tag, task))

    return true

    }

    fun submit(tag: String, task: Callable): Future {

    val future = executor.submit(wrapTask(tag, task))

    taskMap[tag] = future

    return future

    }

    fun pause(tag: String) = taskMap[tag]?.cancel(true)

    fun resume(tag: String, task: Runnable) = submit(tag, task)

    fun cancel(tag: String) {

    taskMap[tag]?.cancel(true)

    taskMap.remove(tag)

    }

    fun shutdown(immediate: Boolean = false) {

    if (immediate) {

    executor.shutdownNow()

    } else {

    executor.shutdown()

    try {

    if (!executor.awaitTermination(30, TimeUnit.SECONDS)) {

    executor.shutdownNow()

    }

    } catch (e: InterruptedException) {

    executor.shutdownNow()

    Thread.currentThread().interrupt()

    }

    }

    taskMap.clear()

    }

    // endregion

    // region 内部实现

    private fun wrapTask(tag: String, task: Runnable): Runnable = Runnable {

    try {

    task.run()

    } finally {

    taskMap.remove(tag)

    }

    }

    private fun wrapTask(tag: String, task: Callable): Callable = Callable {

    try {

    task.call()

    } finally {

    taskMap.remove(tag)

    }

    }

    class Builder {

    var corePoolSize: Int = Runtime.getRuntime().availableProcessors()

    var maxPoolSize: Int = corePoolSize * 2

    var keepAliveTime: Long = 10L

    var workQueue: BlockingQueue? = null

    var threadFactory: ThreadFactory? = null

    var allowCoreThreadTimeout: Boolean = false

    var exceptionHandler: ((Thread, Throwable) -> Unit)? = null

    复制代码
     fun build() = ThreadPoolManager(this)

    }

    private class DefaultThreadFactory(

    private val exceptionHandler: ((Thread, Throwable) -> Unit)?

    ) : ThreadFactory {

    private val group: ThreadGroup

    private val threadNumber = AtomicInteger(1)

    private val namePrefix: String

    复制代码
     init {
         val s = System.getSecurityManager()
         group = s?.threadGroup ?: Thread.currentThread().threadGroup
         namePrefix = "pool-${System.identityHashCode(this)}-thread-"
     }
    
     override fun newThread(r: Runnable): Thread {
         return Thread(group, r, namePrefix + threadNumber.getAndIncrement()).apply {
             isDaemon = false
             priority = Thread.NORM_PRIORITY
             uncaughtExceptionHandler = Thread.UncaughtExceptionHandler { t, e ->
                 exceptionHandler?.invoke(t, e) ?: run {
                     Log.e("ThreadPool", "Uncaught exception in thread ${t.name}", e)
                 }
             }
         }
     }

    }

    // endregion

    }

// region 协程扩展

suspend fun ThreadPoolManager.executeNetworkRequest(

tag: String,

block: suspend () -> Unit

) = coroutineScope {

val job = launch(coroutineDispatcher) {

try {

block()

} catch (e: Exception) {

Log.e("ThreadPool", "Network request failed", e)

throw e

}

}

taskMap[tag] = job.asCancellableFuture()

try {

job.join()

} finally {

taskMap.remove(tag)

}

}

fun Job.asCancellableFuture(): Future = object : Future {

override fun get() = throw UnsupportedOperationException("Use async API instead")

override fun get(timeout: Long, unit: TimeUnit) = throw UnsupportedOperationException()

override fun cancel(mayInterrupt: Boolean): Boolean = also { cancel() }.isCancelled

override fun isDone(): Boolean = isCompleted

override fun isCancelled(): Boolean = isCancelled

}

suspend fun ThreadPoolManager.executeDbOperation(

tag: String,

block: suspend () -> Unit

) = withContext(coroutineDispatcher) {

try {

block()

} catch (e: Exception) {

Log.e("ThreadPool", "DB operation failed", e)

throw e

}

}

// endregion

相关推荐
Brilliantwxx1 天前
【C++】 继承与多态(中)
开发语言·c++·笔记·算法
Aurorar0rua1 天前
CS50 x 2024 Notes C -14
c语言·开发语言·学习方法
new_bie_B1 天前
Android16 Input 事件分发链路
android
小短腿的代码世界1 天前
从.qrc到rcc编译器:Qt资源系统的隐秘运作机制与大型项目性能突围
开发语言·qt
2401_833269301 天前
Java网络编程入门
java·开发语言
青瓦梦滋1 天前
C++的IO流与STL的空间配置器
开发语言·c++
五月君_1 天前
Bun v1.3.14 发布,Rust 版即将进 Claude Code 内测,下一版可能就告别 Zig
开发语言·后端·rust
鱼很腾apoc1 天前
【学习篇】第20期 超详解 C++ 多态:从语法规则到底层原理
java·c语言·开发语言·c++·学习·算法·青少年编程
TDengine (老段)1 天前
TDengine RAFT共识协议 — 选举、日志复制、快照与仲裁
android·大数据·数据库·物联网·架构·时序数据库·tdengine
不吃土豆的马铃薯1 天前
4.SGI STL 二级空间配置器 allocate 与_S_refill 源码解析
c语言·开发语言·c++·dreamweaver·内存池