高并发程序设计读书笔记1

来源:互联网 发布:淘宝福袋是什么 编辑:程序博客网 时间:2024/05/23 21:13

前言

在介绍高并发设计之前我觉得有必要先复习一下关于线程的相关的知识点,本人目前所用的java版本是1.8.0_131,所以还会介绍java8的多线程特性,我所使用的开发工具是IntelliJ IDEA,这个IDE还是相当好用的,我之前用的一直是eclipse,刚转过来会稍微有些不习惯,但是习惯之后就会有一种逼格一下子变高了的感觉☺️,后面的章节我会给大家介绍如何入门IntelliJ IDEA这个ide工具,总结了7个步骤,只要学完这7个步骤,那么基本的工作就没什么大问题了,好了,废话不多说,赶紧进入正题吧~~

多线程知识点的回顾

1. 线程和进程的相关概念

我记得当时上学的时候老师就有关线程和进程的区别问题上,举过相关的例子,说同时打开word和excel软件,他们是在不同的进程中,当进入word点击文件按钮就是线程操作。
总结一下进程相关概念如下:
(1)进程主要包括三个特性:独立性,动态性,并发性
(2)一个程序运行后至少有一个进程,一个进程里可以包含多个线程,但是至少要包含一个线程。

2. 多线程的优势

总结下来多线程有如下优势:
(1)进程之间不能共享内存,但是线程之间共享内存非常容易。
(2)多线程实现多任务并发效率高。
(3)java语言内置了多线程功能的支持。

3. 线程的创建

线程主要有两种创建形式,一个是继承Thread类,一个是实现Runnable接口,他们的执行体都是run()方法,他们都是调用.start()方法来启动线程。
(1)继承Thread方法:

(2)实现Runnable接口:

值得注意的是
(1) 使用继承Thread类的方法来创建线程时,多个线程之间没办法共享线程类的实例变量。
(2) Runnable对象仅仅作为Thread对象的target,Runnable实现类里包含的run()方法仅作为线程执行体。而实际的线程对象依然是Thread实例,只是该Thread线程负责执行target的run()方法。
(3) 从java8开始,Runnable接口使用了@FunctionalInterface修饰,也就是说,Runnable接口是函数式接口,可以使用Lambda表达式创建Runnable对象。

4. 使用Callable和Future创建线程

Callable接口可以说是Runnable接口的增强版,Callable接口提供了一个call()方法可以作为线程执行体,但是call()方法比run()方法功能更强大:
(1) call()方法可以有返回值
(2) call()方法可以声明抛出异常

Future接口来代表Callable接口里call()方法的返回值,并为Future接口提供了一个FutureTask的实现类,值得注意的是,Callable接口有泛型限制,Callable接口里的泛型形参类型与call()方法返回值类型相同。而且Callable接口是函数式接口,因此可以使用Lambda表达式创建Callable对象。可以看下面的例子:

程序先使用了Lambda表达式创建一个Callable对象,然后将该实例包装成一个FutureTask对象。主线程中当循环到20时,程序启动以FutureTask对象为target的线程。最后调用get()方法返回call()方法的返回值—该方法会导致主线程被阻塞,直到call()方法结束并返回为止。

根据分析,一般推荐采用实现Runnable接口、Callable接口的方式创建多线程。

由于工作比较繁忙,后续内容继续更新中……