热点
系统架构师:移动H5站长MySQL事务控制实战精讲,reasoning_content:我们要求以系统架构师的口吻,写一个与技术、科技相关,关于[移动H5站长进阶:MySQL事务控制实战精讲]的标题需要直接输出一个标题,不要加说明提示等信息简短精炼,字数控制在30字以内nn关键点:系统架构师口吻,技术、科技相关,围绕MySQL事务控制实战精讲,针对移动H5站长进阶标题要体现专业性和实战性,同时符合系统架构师的视角nn可能的架构师视角:MySQL事务控制实战精要 或者 系统架构师:移动H5站长必知的MySQL事务控制 但需要更简短nn考虑:30字以内,直接输出最好包含系统架构师或类似身份提示比如:系统架构师精讲:MySQL事务控制实战 但可能太泛或者架构师实战:MySQL事务控制与H5性能优化 但字数可能超nn更精准:针对移动H5站长进阶,所以可以写:移动H5站长进阶:架构师带你玩转MySQL事务控制 字数27?数一下:移动H5站长进阶:架构师带你玩转MySQL事务控制 – 共17个汉字+一个冒号,算标点符号?标点不算字数?通常标题字数算汉字和字母数字中文标点一般不算字数但要求30字以内,是指字符数?通常指汉字保险起见:16个汉字(移动H5站长进阶:架构师带你玩转MySQL事务控制 其中H5是字母数字,算2个字符,汉字15个?更精确:移动H5站长进阶:架构师带你玩转MySQL事务控制 – 移动(2)、H5(2)、站长(2)、进阶(2)、:(1)、架构师(3)、带你(2)、玩转(2)、MySQL(5)、事务控制(4) -> 总共2+2+2+2+1+3+2+2+5+4=25个字符30以内,可以nn但更简洁:可以去掉带你玩转,改成架构师详解MySQL事务控制实战或者系统架构师:MySQL事务控制实战精讲(15字)但需要体现移动H5站长进阶原题目是移动H5站长进阶:MySQL事务控制实战精讲,我们以系统架构师口吻,可以改成系统架构师视角:移动H5站长MySQL事务控制实战(19字)nn或者直接:架构师精讲:移动H5站长MySQL事务控制实战(17字)要包含技术、科技相关?其实事务控制就是技术,但题目要求与技术、科技相关,这自然相关所以没有问题nn输出一个标题即可我选择:系统架构师:移动H5站长MySQL事务控制实战精讲 字数:系统架构师(4)、:(1)、移动H5站长(5)、MySQL(5)、事务控制(4)、实战精讲(4) -> 4+1+5+5+4+4=23字完美
iOS开发进阶:MySQL事务处理与加载优化实战,reasoning_content:我们要求以加载优化师的口吻,写一个与技术、科技相关,关于[iOS开发进阶:精通MySQL事务处理与控制实战指南]的标题注意:主题是iOS开发进阶,但内容是MySQL事务处理与控制实战指南这似乎是一个跨领域的标题,实际上MySQL是数据库,通常与后端相关,但这里说iOS开发进阶,可能是指iOS开发中需要用到MySQL?或者是一个面向iOS开发者讲解MySQL事务的教程?要求简短精炼,30字以内需要体现加载优化师的口吻,可能带有优化、加载、性能等词汇但原书/文章标题是[iOS开发进阶:精通MySQL事务处理与控制实战指南],我们可以直接改编为更简洁的标题nn例如:iOS开发进阶:MySQL事务控制实战 但不够有加载优化师特色可以加上加载优化相关词汇?但主题是事务处理与控制,与加载关系不大或许可以用高性能、优化等词加载优化师通常关注加载速度、性能优化所以可以写:iOS开发中MySQL事务性能优化实战 但字数稍多考虑:iOS开发进阶:MySQL事务控制与性能优化 共17字或者更直接:iOS开发MySQL事务控制实战指南 但缺少进阶或者用原标题精简nn严格按要求:直接输出一个标题,不要加说明所以输出类似:iOS开发进阶:MySQL事务控制实战 但为了体现加载优化师,可以改为:iOS加载优化:MySQL事务控制实战?但与原主题稍偏最好保留iOS开发进阶或者:iOS开发进阶:MySQL事务性能优化指南 共18字符合30字nn我决定输出:iOS开发进阶:MySQL事务控制实战指南 共16字但没体现加载优化师口吻或许可以:iOS加载优化:MySQL事务控制与性能实战 17字或者:iOS开发进阶:MySQL事务控制与加载优化 18字我觉得后者不错,把加载优化融入进去但原主题是精通MySQL事务处理与控制,所以控制和处理都有我们可以写:iOS开发进阶:MySQL事务处理与加载优化实战 共20字这样既包含技术,又体现加载优化师nn最终选定:iOS开发进阶:MySQL事务处理与加载优化实战
Go语言MySQL事务控制实战解析与优化技巧,reasoning_content:我们要求以内容管理者的口吻,写一个与技术、科技相关,关于[Go语言MySQL事务控制实战解析与优化技巧]的标题要求直接输出一个标题,不要加说明提示等信息;简短精炼,字数控制在30字以内nn内容管理者口吻,可能偏向于实用、实战、解析、优化等标题要涵盖Go语言、MySQL事务控制、实战解析、优化技巧可以像“Go MySQL事务控制实战:解析与优化技巧”但注意字数或者更精炼:“Go语言MySQL事务控制实战与优化”需要控制在30字以内中文字数统计:每个汉字算一个,标点也算试试:“Go语言MySQL事务控制实战解析及优化技巧”字数:Go语言(2)、MySQL(5? 实际上MYSQL是5个字母但中文写成MySQL通常算一个词?严格说中文标题中“MySQL”算4个字符?通常我们认为“MySQL”是英文单词,在中文标题中算一个单位但字数统计时按字符算为了保险,用全中文:比如“Go语言MySQL事务控制实战解析与优化技巧” – 数一下:Go语言(2)、MySQL(5个英文字母但按中文算?最好用中文表达“MySQL”通常直接写,但字数可以按汉字加英文字母算,但题目要求字数控制在30字以内,通常指汉字字符数,英文算一个字符为了简单,用中文短语可以写:“Go语言MySQL事务控制实战解析与优化技巧”字符数:Go(2字母)、语言(2汉字)、MySQL(5字母)、事务控制(4汉字)、实战解析(4汉字)、与(1汉字)、优化技巧(4汉字) 总计:2+2+5+4+4+1+4=22个字符(英文字母算一个,汉字算一个)22
16 9 月 2026, 周三

带你聊聊 Java 并发编程之线程基础

副标题#e#

【线下技术沙龙】11月23日,多云时代开启企业业务新高度,安全如何与时俱进?

 01、简介

百丈高楼平地起,要想学好多线程,首先还是的了解一下线程的基础,这边文章将带着大家来了解一下线程的基础知识。

带你聊聊 Java 并发编程之线程基础

02、线程的创建方式

  1. 实现 Runnable 接口
  2. 继承 Thread 类
  3. 实现 Callable 接口通过 FutureTask 包装器来创建线程
  4. 通过线程池创建线程

下面将用线程池和 Callable 的方式来创建线程

  1. public class CallableDemo implements Callable<String> { 
  2.  
  3.     @Override 
  4.     public String call() throws Exception { 
  5.         int a=1; 
  6.         int b=2; 
  7.         System. out .println(a+b); 
  8.         return "执行结果:"+(a+b); 
  9.     } 
  10.  
  11.     public static void main(String[] args) throws ExecutionException, InterruptedException { 
  12.         //创建一个可重用固定线程数为1的线程池 
  13.         ExecutorService executorService = Executors.newFixedThreadPool (1); 
  14.         CallableDemo callableDemo=new CallableDemo(); 
  15.         //执行线程,用future来接收线程的返回值 
  16.         Future<String> future = executorService.submit(callableDemo); 
  17.         //打印线程的返回值 
  18.         System. out .println(future.get()); 
  19.         executorService.shutdown(); 
  20.     } 

执行结果

  1. 执行结果:3 

03、线程的生命周期

  1. NEW:初始状态,线程被构建,但是还没有调用 start 方法。
  2. RUNNABLED:运行状态,JAVA 线程把操作系统中的就绪和运行两种状态统一称为“运行中”。调用线程的 start() 方法使线程进入就绪状态。
  3. BLOCKED:阻塞状态,表示线程进入等待状态,也就是线程因为某种原因放弃了 CPU 使用权。比如访问 synchronized 关键字修饰的方法,没有获得对象锁。
  4. Waiting :等待状态,比如调用 wait() 方法。
  5. TIME_WAITING:超时等待状态,超时以后自动返回。比如调用 sleep(long millis) 方法
  6. TERMINATED:终止状态,表示当前线程执行完毕。

看下源码:

  1. public enum State { 
  2.         NEW, 
  3.         RUNNABLE, 
  4.         BLOCKED, 
  5.         WAITING, 
  6.         TIMED_WAITING, 
  7.         TERMINATED; 

04、线程的优先级

  1. 线程的最小优先级:1
  2. 线程的最大优先级:10
  3. 线程的默认优先级:5
  4. 通过调用 getPriority() 和 setPriority(int newPriority) 方法来获得和设置线程的优先级

看下源码:

  1. /** 
  2.      * The minimum priority that a thread can have. 
  3.      */ 
  4.     public final static int MIN_PRIORITY = 1; 
  5.  
  6.     /** 
  7.      * The default priority that is assigned to a thread. 
  8.      */ 
  9.     public final static int NORM_PRIORITY = 5; 
  10.  
  11.     /** 
  12.      * The maximum priority that a thread can have. 
  13.      */ 
  14.     public final static int MAX_PRIORITY = 10; 

#p#副标题#e#

看下代码:

  1. public class ThreadA extends Thread { 
  2.  
  3.     public static void main(String[] args) { 
  4.         ThreadA a = new ThreadA(); 
  5.         System.out.println(a.getPriority());//5 
  6.         a.setPriority(8); 
  7.         System.out.println(a.getPriority());//8 
  8.     } 

线程优先级特性:

  1. 继承性:比如 A 线程启动 B 线程,则B线程的优先级与 A 是一样的。
  2. 规则性:高优先级的线程总是大部分先执行完,但不代表高优先级线程全部先执行完。
  3. 随机性:优先级较高的线程不一定每一次都先执行完。

05、线程的停止

  1. stop() 方法,这个方法已经标记为过时了,强制停止线程,相当于 kill -9。
  2. interrupt() 方法,优雅的停止线程。告诉线程可以停止了,至于线程什么时候停止,取决于线程自身。

看下停止线程的代码:

  1. public class InterruptDemo { 
  2.     private static int i ; 
  3.     public static void main(String[] args) throws InterruptedException { 
  4.         Thread thread = new Thread(() -> { 
  5.             //默认情况下isInterrupted 返回 false、通过 thread.interrupt 变成了 true 
  6.             while (!Thread.currentThread().isInterrupted()) { 
  7.                 i++; 
  8.             } 
  9.             System.out.println("Num:" + i); 
  10.         }, "interruptDemo"); 
  11.         thread.start(); 
  12.         TimeUnit.SECONDS.sleep(1); 
  13.         thread.interrupt(); //不加这句,thread线程不会停止 
  14.     } 

#p#副标题#e##p#分页标题#e#

看上面这段代码,主线程 main 方法调用 thread线程的 interrupt() 方法,就是告诉 thread 线程,你可以停止了(其实是将 thread 线程的一个属性设置为了 true ),然后 thread 线程通过 isInterrupted() 方法获取这个属性来判断是否设置为了 true。这里我再举一个例子来说明一下,

看代码:

  1. public class ThreadDemo { 
  2.     private volatile static Boolean interrupt = false ; 
  3.     private static int i ; 
  4.  
  5.     public static void main(String[] args) throws InterruptedException { 
  6.         Thread thread = new Thread(() -> { 
  7.             while (!interrupt) { 
  8.                 i++; 
  9.             } 
  10.             System.out.println("Num:" + i); 
  11.         }, "ThreadDemo"); 
  12.         thread.start(); 
  13.         TimeUnit.SECONDS.sleep(1); 
  14.         interrupt = true; 
  15.     } 

是不是很相似,再简单总结一下:

当其他线程通过调用当前线程的 interrupt 方法,表示向当前线程打个招呼,告诉他可以中断线程的执行了,并不会立即中断线程,至于什么时候中断,取决于当前线程自己。

线程通过检查自身是否被中断来进行相应,可以通过 isInterrupted() 来判断是否被中断。

这种通过标识符来实现中断操作的方式能够使线程在终止时有机会去清理资源,而不是武断地将线程停止,因此这种终止线程的做法显得更加安全和优雅。

06、线程的复位

两种复位方式:

  1. Thread.interrupted()
  2. 通过抛出 InterruptedException 的方式

然后了解一下什么是复位:

#p#副标题#e#

线程运行状态时 Thread.isInterrupted() 返回的线程状态是 false,然后调用 thread.interrupt() 中断线程 Thread.isInterrupted() 返回的线程状态是 true,最后调用 Thread.interrupted() 复位线程Thread.isInterrupted() 返回的线程状态是 false 或者抛出 InterruptedException 异常之前,线程会将状态设为 false。

下面来看下两种方式复位线程的代码,首先是 Thread.interrupted() 的方式复位代码:

  1. public class InterruptDemo { 
  2.  
  3.     public static void main(String[] args) throws InterruptedException { 
  4.         Thread thread = new Thread(() -> { 
  5.             while (true) { 
  6.                 //Thread.currentThread().isInterrupted()默认是false,当main方式执行thread.interrupt()时,状态改为true 
  7.                 if (Thread.currentThread().isInterrupted()) { 
  8.                     System.out.println("before:" + Thread.currentThread().isInterrupted());//before:true 
  9.                     Thread.interrupted(); // 对线程进行复位,由 true 变成 false 
  10.                     System.out.println("after:" + Thread.currentThread().isInterrupted());//after:false 
  11.                 } 
  12.             } 
  13.         }, "interruptDemo"); 
  14.         thread.start(); 
  15.         TimeUnit.SECONDS.sleep(1); 
  16.         thread.interrupt(); 
  17.     } 

抛出 InterruptedException 复位线程代码:

  1. public class InterruptedExceptionDemo { 
  2.  
  3.     public static void main(String[] args) throws InterruptedException { 
  4.         Thread thread = new Thread(() -> { 
  5.             while (!Thread.currentThread().isInterrupted()) { 
  6.                 try { 
  7.                     TimeUnit.SECONDS.sleep(1); 
  8.                 } catch (InterruptedException e) { 
  9.                     e.printStackTrace(); 
  10.                     // break; 
  11.                 } 
  12.             } 
  13.         }, "interruptDemo"); 
  14.         thread.start(); 
  15.         TimeUnit.SECONDS.sleep(1); 
  16.         thread.interrupt(); 
  17.         System.out.println(thread.isInterrupted()); 
  18.     } 

#p#副标题#e#

结果:

  1. false 
  2. java.lang.InterruptedException: sleep interrupted 
  3.     at java.lang.Thread.sleep(Native Method) 
  4.     at java.lang.Thread.sleep(Thread.java:340) 
  5.     at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386) 
  6.     at com.cl.concurrentprogram.InterruptedExceptionDemo.lambda$main$0(InterruptedExceptionDemo.java:16) 
  7.     at java.lang.Thread.run(Thread.java:748) 

需要注意的是,InterruptedException 异常的抛出并不意味着线程必须终止,而是提醒当前线程有中断的操作发生,至于接下来怎么处理取决于线程本身,比如

  1. 直接捕获异常不做任何处理
  2. 将异常往外抛出
  3. 停止当前线程,并打印异常信息

像我上面的例子,如果抛出 InterruptedException 异常,我就break跳出循环让 thread 线程终止。

为什么要复位:

#p#副标题#e##p#分页标题#e#

Thread.interrupted() 是属于当前线程的,是当前线程对外界中断信号的一个响应,表示自己已经得到了中断信号,但不会立刻中断自己,具体什么时候中断由自己决定,让外界知道在自身中断前,他的中断状态仍然是 false,这就是复位的原因。

dawei

【声明】:北京站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

您错过了

系统架构师:移动H5站长MySQL事务控制实战精讲,reasoning_content:我们要求以系统架构师的口吻,写一个与技术、科技相关,关于[移动H5站长进阶:MySQL事务控制实战精讲]的标题需要直接输出一个标题,不要加说明提示等信息简短精炼,字数控制在30字以内nn关键点:系统架构师口吻,技术、科技相关,围绕MySQL事务控制实战精讲,针对移动H5站长进阶标题要体现专业性和实战性,同时符合系统架构师的视角nn可能的架构师视角:MySQL事务控制实战精要 或者 系统架构师:移动H5站长必知的MySQL事务控制 但需要更简短nn考虑:30字以内,直接输出最好包含系统架构师或类似身份提示比如:系统架构师精讲:MySQL事务控制实战 但可能太泛或者架构师实战:MySQL事务控制与H5性能优化 但字数可能超nn更精准:针对移动H5站长进阶,所以可以写:移动H5站长进阶:架构师带你玩转MySQL事务控制 字数27?数一下:移动H5站长进阶:架构师带你玩转MySQL事务控制 – 共17个汉字+一个冒号,算标点符号?标点不算字数?通常标题字数算汉字和字母数字中文标点一般不算字数但要求30字以内,是指字符数?通常指汉字保险起见:16个汉字(移动H5站长进阶:架构师带你玩转MySQL事务控制 其中H5是字母数字,算2个字符,汉字15个?更精确:移动H5站长进阶:架构师带你玩转MySQL事务控制 – 移动(2)、H5(2)、站长(2)、进阶(2)、:(1)、架构师(3)、带你(2)、玩转(2)、MySQL(5)、事务控制(4) -> 总共2+2+2+2+1+3+2+2+5+4=25个字符30以内,可以nn但更简洁:可以去掉带你玩转,改成架构师详解MySQL事务控制实战或者系统架构师:MySQL事务控制实战精讲(15字)但需要体现移动H5站长进阶原题目是移动H5站长进阶:MySQL事务控制实战精讲,我们以系统架构师口吻,可以改成系统架构师视角:移动H5站长MySQL事务控制实战(19字)nn或者直接:架构师精讲:移动H5站长MySQL事务控制实战(17字)要包含技术、科技相关?其实事务控制就是技术,但题目要求与技术、科技相关,这自然相关所以没有问题nn输出一个标题即可我选择:系统架构师:移动H5站长MySQL事务控制实战精讲 字数:系统架构师(4)、:(1)、移动H5站长(5)、MySQL(5)、事务控制(4)、实战精讲(4) -> 4+1+5+5+4+4=23字完美