前言,基础线程机制:Executor管理多个异步任务的执行、Daemon守护线程、sleep()、yield()
一、Executor:
1.newCachedThreadPool(),一个任务创建一个线程
1 2 3 4 5 | ExecutorService executorService = Executors.newCachedThreadPool(); executorService.execute(()->{ //TODO do sth. }); executorService.shutdown(); |
2.newFixedThreadPool(num),所有任务使用固定num大小的线程
1 2 3 4 5 6 7 8 9 10 | CountDownLatch countDownLatch = new CountDownLatch(clientSize); ExecutorService executorService = Executors.newFixedThreadPool(clientSize); IntStream.range( 0 ,clientSize).forEach(i -> executorService.submit(()->{ //TODO do sth. countDownLatch.countDown(); }) ); countDownLatch.await(); executorService.shutdown(); |
>>> 输出效果:[clientSize]个线程并发执行//TODO do sth.
3.newSingleThreadExecutor(),相当于newFixedThreadPool(1)
1 2 | ExecutorService executorService2 = Executors.newSingleThreadExecutor(); executorService2.shutdown(); |
二、Daemon
1 2 3 4 5 6 7 8 | // Daemon守护线程。当所有非守护线程结束时,程序终止,同时杀死所有守护线程。main()属于非守护线程 public void m2(){ Thread t1 = new Thread(()->{ //TODO do sth. }); // 通过setDaemon设置该线程td为守护线程 t1.setDaemon( true ); } |
三、sleep()
1 2 3 4 5 6 7 8 | // 基础线程机制:Thread.sleep(ms) public void m3(){ try { Thread.sleep( 3000 ); } catch (InterruptedException e) { throw new RuntimeException(e); // 因为异常不能跨线程传播回main()中,因此必须在本地进行处理 } } |
四、yield()
1 2 3 4 | // 基础线程机制:yield(),对静态方法Thread.yidld()的调用声明了当前线程已经完成了生命周期中的最重要部分,可切换给其他线程执行。只是对线程调度器的一个建议 public void m4(){ Thread.yield(); } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理