Java高并发程序设计1

Java多线程一直是Java学习的重点与难点,本人今天重点学习Java高并发一书,对其中的知识点做一个梳理。

本文脉络:主要介绍终止线程与中断线程的几种方式,终止线程中stop被遗弃,而用stopMe+break的定义方式,同时推荐使用抛出中断异常的方式。中断线程的三个方法(主要用第一个,第二个),一个中断,一个检查中断返回TRUE,两个都是非静态方法。

Java基本的线程控制

1.开始线程:extends thread 与 implements runnable

2.终止线程:stop()(但jdk已废弃):使用方式:


stop用法

stop作废的原因:当一个写线程对数据操作时,刚要写入时,此线程终止(数据未写入但锁已释放),另一个读线程读取此数据,便发生数据不一致问题。

线程终止方式:设置stopMe()方法,并用break返回。


线程终止用法

但这个地方只是终止了for循环的执行,假设for后面还有执行语句,如何全部停止(不使用return)?

异常法:


异常法中断异常

3. 线程中断:线程中断并不会使线程马上退出,而是给线程发送一个通知,告诉线程有人希望你退出了。而目标线程收到通知后如何处理,则完全由主线程自行决定。

三个主要方法:thread.interrupt()中断线程:通知目标线程中断并设置中断标志位为true.

thread.isInterrupted()判断是否被中断:判断当前线程是否中断(通过检查中断标志位)

Thread.interrupted()判断是否被中断并清除当前中断状态:判断当前线程是否中断同时清除中断位。

首先,如果我们仅仅使用interrupt,是无法中断线程的,如下:


未中断

需要加入isInterrupted()判断


但这里中断位也都是FALSE,因为调用的是当前线程main,所以是FALSE。


这样第一个就为TRUE,对于第二个为FALSE。因为interrupted不光判断,还会将标志位变为清除,也就是变为false。

正确的做法:


同时又出现问题:程序虽然中断(抛出中断异常),但后面的输出仍然继续,这就牵扯到如下:

线程在sleep中中断异常:

在线程sleep时被中断,线程自动标志位为false,所以,继续for循环仍然可以执行,修噶为:


说明:1.所有在main线程下定义的线程都是其子线程,在main方法中执行的代码都是主线程在执行,调用Thread.currentThread也可以很明确的看到。

           2.main中定义线程,这时jvm中就维护着两个线程了,sleep表示当前线程休眠,且必须抛出中断异常(检查时异常),而interrupt表示目标线程中断,isinterrupted表示当前线程中断,一定要理解明白。

          3.throw new exception表示生成异常,throws exception表示捕获异常。

          4.分析多线程,一定要了解有几个线程、每个线程在干什么、多核的话多个线程可以同时运行、线程方法的作用等。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、并发 进程:每个进程都拥有自己的一套变量 线程:线程之间共享数据 1.线程 Java中为多线程任务提供了很多的...
    SeanMa阅读 7,622评论 0 11
  • 实战Java高并发程序设计笔记 有关线程你必须知道的事 进程进程(Process)是计算机中程序关于某数据集合上的...
    辣公公阅读 2,900评论 0 4
  • 一、线程的生命周期 线程状态转换图: 1、新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线...
    我是嘻哈大哥阅读 4,492评论 0 8
  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 8,125评论 1 18
  • 生命中 你注定 有那么多热情 需要迸发 有那么多爱 需要表达 有那么纯的光 需要散发 你如此独特 热爱自由 爱好和...
    创造全新幸福生活阅读 1,684评论 0 0

友情链接更多精彩内容