背景说明:

多线程并发与管理,是java基础知识里的重点,本文根据《java核心技术第八版》中的多线程技术的学习,对知识点进行整理;这里只对基础知识点进行简单罗列,以达到对知识点有网状关联的效果,能起到提纲挈领的作用,在于其它知识点融合时,有更好的一览效果。

线程概念

1.明确进程与线程的区别

2.不要调用Thread或Runnable对象的run方法,直接调用run方法,只会执行同一个线程中的任务,而不会启动新线程。应该调用Thread.start方法。这个方法将创建一个执行run方法地新线程。

中断线程

1.请求终止线程的方法是interrupt方法

2.在线程阻塞状态下调用interrupt方法时,会产生InterruptException异常。

3.有2个类似方法,interrupted和isInterrupted方法;interrupted是静态方法,它检测当前线程是否中断,并清除该线程的中断状态;isInterrupted是一个实例方法,可用来检验是否线程被终止,不改变线程的中断状态。

线程状态

  1. 新生
  2. Runnable 可运行状态
  3. Blocked 被阻塞
  4. Waiting 等待
  5. Timed waiting 计时等待
  6. Terminated 被终止

重点说明:

Thread的stop,suspend,resume方法已经过时。

Thread.join 方法等待终止指定的线程。注:如果有3个线程,依次分别执行,强调按照顺序执行,主要考察的就是这个方法地使用。

线程属性

属性包括:线程优先级,守护线程,线程组以及处理未捕获异常的处理器

1.优先级

可以设置最小到最大:1到10,norm_priority被定义为5

2.守护线程

作用就是为其它线程服务

同步

常用来举例就是多个线程同时存取钱或者是买火车票。

1.锁对象

从java1.5起,有2种机制可以防止代码受到并发访问的干扰:synchronized ,ReentrantLock.。把解锁操作括在finally子句之内是至关重要的。

2.条件对象

条件对象用来管理哪些已经获得了一个锁但是缺不能有用工作的线程。举例子:如果在多线程转账时,如果账户余额不足,需要等待其他线程转入金额时,就是典型用到条件对象的地方;这里面用到了锁,一个锁可以有一个或多个相关的条件对象。通过条件对象的await方法,当前线程就被阻塞了,并放弃了锁。一个线程调用了await方法,它进入了该条件的等待集,等锁可用时,该线程不能马上解除阻塞,相反它是处于阻塞状态,直到另一个线程调用同一个条件对象的signalAll方法时为止。

3.synchronized关键字

相当于一个内部锁,只有一个条件对象。利用Object的wait,notifyAll,notify;与条件对象里的方法不同:await,signalAll,singal

4.同步阻塞

5.Volatile域

对于域的并发访问是安全的:

  • 域是final,并且在构造器调用完成之后被访问;
  • 对域的访问,由共有锁进行保护
  • 域是Volatile

6.锁测试与超时

因为lock方法是不能被中断的,如果一个线程在等待一个锁时被中断,中断线程在获得锁之前一直处于阻塞状态。如果出现死锁,那么lock方法就无法终止。然而调用带有超时参数的tryLock,那么线程在等待期间被中断,将抛出InterruptedException异常。这是一个非常有用的特性,因为允许程序打破死锁。

7.读写锁

如果很多线程从一个数据结构读取数据而很少线程修改其中数据的话,用ReentrantReadWriteLock类就非常有用。

阻塞队列

对于许多线程问题,可以通过使用一个或多个队列以优雅而安全的方式将其形式化。

ArrayBlockQueue

LinkedBlockQueue

线程安全的集合

ConcurrentHashMap

ConcurrentSkipListMap

ConcurrentSkipListSet

ConcurrentLinkedQueue

在java以前版本中,Vector和HashTable提供了线程安全,在1.2中这些类被弃用,取而代之的是ArrayList和HashMap,这些类不是线程安全的,而集合库中提供了不同的机制,通过使用同步包装器变成线程安全的

Collections.synchronizedList(new ArrayList)

Collections.synchronizedMap(new HashMap)

Callable与Future

FutureTask包装器是一种非常便利的机制,可以将Callable转换为Future和Runnable

Callable<Integer> myComputation = …

FutureTask<Integer> task = new FutureTask<Integer>(myComputation);

Thread t = new Thread(task);//it is a Runnable

t.start();

Integer result = task.get();//it is future

执行器

Executors中有newCachedThreadPool,newFixedThreadPool,newSingleThreadExecutor

还有预定执行,newScheduledThreadPool

同步器

1.倒计时门栓CountDownLatch

一次性的,一旦计数为0,就不能再重用

学习笔记-java 多线程的更多相关文章

  1. 孙鑫VC学习笔记:多线程编程

    孙鑫VC学习笔记:多线程编程 SkySeraph Dec 11st 2010  HQU Email:zgzhaobo@gmail.com    QQ:452728574 Latest Modified ...

  2. [java学习笔记]java语言核心----面向对象之this关键字

    一.this关键字 体现:当成员变量和函数的局部变量重名时,可以使用this关键字来区别:在构造函数中调用其它构造函数 原理:         代表的是当前对象.         this就是所在函数 ...

  3. [java学习笔记]java语言核心----面向对象之构造函数

    1.构造函数概念 特点: 函数名与类名相同 不用定义返回值类型 没有具体的返回值 作用:                给对象进行初始化 注意: 默认构造函数 多个构造函数是以重载出现的 一个类中如果 ...

  4. 大数据学习笔记——Java篇之集合框架(ArrayList)

    Java集合框架学习笔记 1. Java集合框架中各接口或子类的继承以及实现关系图: 2. 数组和集合类的区别整理: 数组: 1. 长度是固定的 2. 既可以存放基本数据类型又可以存放引用数据类型 3 ...

  5. Java学习笔记 -- Java定时调度工具Timer类

    1 关于 (时间宝贵的小姐姐请跳过) 本教程是基于Java定时任务调度工具详解之Timer篇的学习笔记. 什么是定时任务调度 基于给定的时间点,给定的时间间隔或者给定的执行次数自动执行的任务. 在Ja ...

  6. 大数据学习笔记——Java篇之网络编程基础

    Java网络编程学习笔记 1. 网络编程基础知识 1.1 网络分层图 网络分层分为两种模型:OSI模型以及TCP/IP网络模型,前者模型分为7层,是一个理论的,参考的模型:后者为实际应用的模型,具体对 ...

  7. 大数据学习笔记——Java篇之IO

    IO学习笔记整理 1. File类 1.1 File对象的三种创建方式: File对象是一个抽象的概念,只有被创建出来之后,文件或文件夹才会真正存在 注意:File对象想要创建成功,它的目录必须存在! ...

  8. NDK学习笔记-JNI多线程

    前面讲到记录到ffmpeg音视频解码的时候,采用的是在主线程中进行操作,这样是不行的,在学习了POSIX多线程操作以后,就可以实现其在子线程中解码了,也可以实现音视频同步了 简单示例 在native实 ...

  9. [Java学习笔记] Java异常机制(也许是全网最独特视角)

    Java 异常机制(也许是全网最独特视角) 一.Java中的"异常"指什么 什么是异常 一句话简单理解:异常是程序运行中的一些异常或者错误. (纯字面意思) Error类 和 Ex ...

随机推荐

  1. Codeforces - 240F 是男人就上26棵线段树

    #include<bits/stdc++.h> using namespace std; const int maxn = 1e5+11; typedef long long ll; ch ...

  2. pingUtil

    package unit; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamR ...

  3. NodeJS使用SSL证书

    [From] https://segmentfault.com/q/1010000004705326 var options = { key: fs.readFileSync('../ssl/priv ...

  4. 剑指offer——面试题10:斐波那契数列

    个人答案: #include"iostream" #include"stdio.h" #include"string.h" using na ...

  5. Ignite cahce 存储object类型数据和object类型数据序列化后string存储区别

    Ignite cache在存储时 object类型的数据和 序列化该object成string类型 两者存储时间差不多. 但是这两者在读取出来的时候,string类型比object类型快很多. 以下为 ...

  6. Springboot与MyBatis简单整合

    之前搭传统的ssm框架,配置文件很多,看了几天文档才把那些xml的逻辑关系搞得七七八八,搭起来也是很麻烦,那时我完全按网上那个demo的版本要求(jdk和tomcat),所以最后是各种问题没成功跑起来 ...

  7. android主线程ActivityThread

    ActivityThread在Android中它就代表了Android的主线程,但是并不是一个Thread类. 源码如下: http://androidxref.com/6.0.0_r1/xref/f ...

  8. ELK 搭建实战

    一, 软件介绍 01,为什么用到ELK? 一般我们需要进行日志分析场景:直接在日志文件中 grep.awk 就可以获得自己想要的信息.但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大 如何 ...

  9. 【3dsMax安装失败,如何卸载、安装3dMax 2011?】

    AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...

  10. 求入栈顺序为1234……N的序列的所有可能的出栈序列

    class Program { private static void Fun(int x, int n, Stack<int> stack, List<int> outLis ...