《JAVA线程与并发编程实践》:并发工具类和Executor框架

Java线程和并发工具是应用开发中的重要部分,备受开发者的重视,也有一定的学习难度。《JAVA线程与并发编程实践》是针对Java 8中的线程特性和并发工具的快速学习和实践指南。

《JAVA线程与并发编程实践》共8章,分别介绍了Thread 类Runnable 接口同步等待和通知线程组定时器框架井发工具同步器锁框架,以及高级并发工具等方面的主题。每章的来尾都以练习题的方式,帮助读者巩固所学的知识。附录A给出了所有练习题的解答,附录B给出了一个基于Swing线程的教程。

《JAVA线程与并发编程实践》目录

私信小编“学习”,即可获得《JAVA线程与并发编程实践》整套电子书

本书适合有一定基础的Java程序员阅读学习,尤其适合想要掌握Java线程和并发工具的读者阅读参考。

Thread和Runnable

Java程序是通过线程执行的,线程在程序中具有独立的执行路径。当多条线程执行时,它们彼此之间的路径可以不同。举个例子,一条线程可能在执行switch语句的某个case分支,另一条线程很可能在执行其他case分支。每个Java应用程序都有一个执行main( )函数的默认主线程。应用程序也可以创建线程在后台操作时间密集型任务,以确保对用户的响应。这些封装了代码执行序列的线程对象就被称为runnable.Java虚拟机给每条线程分配独立的JVM栈空间以免彼此干扰。独立的栈使得线程可以追踪它们自己下一条要执行的指令,这些指令会依线程不同而有所区别。栈空间也为每条线程单独准备了- 份方法参数、局部变量以及返回值的拷贝。Java主要是通过java. lang. Thread类以及java. lang. Runnable接口

Thread和Runnable简介

Thread类为底层操作系统的线程体系架构提供一套统一接口 (操作系统通常负责创建和管理线程)。单个的操作系统线程和一个Thread对象关联。

Runnable接口为关联Thread对象的线程提供执行代码。这些代码放在Runnable的void run( )方法中,这个方法虽然不接收任何参数且没有返回值,但是有可能抛出异常。

1.1 创建 Thread和Runnable对象

除了默认主线程,线程都是通过创建合适的Thread和Runnable对象进入应用程序的。Thread类声明了几个构造方法来初始化Thread对象。其中有几个构造方法需要接收Runnable对象作为参数。我们有两种方式创建Runnable 对象。第一种方式是创建一个实现了Runnable接口的匿名类,如下:

Runnable r m new Runnable()

{

@Override

public void run()

// perform some work

System. out . println( "Hello from thread");

}

};

在Java8之前,这是唯一一种 创建runnable的方式。不过,Java 8引入lambda表达式更为快捷地创建runnable:Runnable r = () -> System. out . print1n("Hello from thread");lambda确实比匿名类更简洁。我会在本章及随后的章节继续使用这些语言特性。

1.2 获取和设置线程的名称

每个Thread对象都会被赋予一一个名称, 这样有利于调试。这个名称如果不是显式指定的,那么默认会以一个Thread-作为前缀。你可以通过调用Thread的String getName()方法来获取这个名称。若要设置名称,则得把名称传递给一个合适的构造函数,如Thread(Runnable r, String name),或者调Thread的void setName (String name)方法。如下面的代码片段所示:

Thread t1 = new Thread(r, "thread t1"); .

System. out.println(t1.getName()); // Output: thread t1

Thread t2■new Thread(r);

t2. setName("thread t2");

System. out.println(t2. getName()); // Output: thread t2

1.3 获取一条线程的执行状态

线程的执行状态由Thread . State枚举常量标识:

●NEW:该状态下线程还没有开始执行。

●RUNNABLE:该状态下线程正在JVM中执行。

●BLOCKED:该状态下线程被阻塞并等待一个监听锁(我会在第2章中介绍监听锁)。

●WAITING: 该状态下线程无限期地等待另外一条线程执行特定的操作。

●TIMED_ WAITING: 该状态下线程在特定的时间内等待另外一条线程执行某种操作。

●TERMINATED:该状态下线程已经退出。

Thread通过提供Thread . State getState()方法来让应用程序判断线程的当前状态。示例如下:

Thread t = new Thread(r);

System. out. println(t.getState()); // output: NEW

并发工具类和Executor框架

2.1 并发工具类简介

Java对底层线程操作的支持使得你可以创建多线程应用程序。这些程序比对应的单线程程序提供了更好的性能和响应能力。尽管如此,依然存在一一些问题:

●低级的并发原语, 比如synchronized和wait()、notify()经常难以正确使用。对这些原语的误用会导致竞态条件、线程饿死、死锁和其他风险,这些风险都很难侦测和调试。

●太过依赖 synchronized原语会带来性能问题,这些问题会影响应用程序的可扩展性,对于诸如Web服务器之类的高度线程化的应用程序而言,后果会很严重。

●开发 者经常需要高级的线程结构,如线程池和信号量。Java对底层线程操作的支持中不包含这些结构,开发者被迫构建一套自己的结构,这样不仅耗时还容易出错。为了解决这些问题,Java5引入了并发工具类,这是一个由强大且易扩展的高性能线程工具类组成的框架,包含了线程池和阻塞队列。该框架由下列包中的多种类型组成。

●; java.util.concurrent: 经常在并发编程当中使用的工具类, 如:executors。

●java. util. concurrent.atomic: 支持在单个变量上进行无锁且线程安全操作的工具类。

●java.util. concurrent. locks: 在某些条件上(这类对象会暂停执行“等待”线程直到被其他线程唤醒,此时对象的一些布尔型状态可能变为true)获取锁和执行等待的工具类。通过这些类型进行锁或等待操作比通过Java基于监听器的同步以及等待、唤醒机制具有更好的性能和伸缩性。这个框架也将longnanoTime( )方法引入了类java.1ang.System中,这让你做相对时间测量的时候可以访问纳秒级别的时间资源。并发工具类可以被分类为executor、同步器( synchronizer)以及锁框架等。我会在接下来的章节探讨executor并在后续章节讨论其余类别。

总结

本书适合有一定基础的Java程序员阅读学习,尤其适合想要掌握Java线程和并发工具的读者阅读参考。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容