多线程学习笔记

1.什么是线程

操作系统中 打开一个程序就是一个进程

一个进程可以创建多个线程

现在系统中 系统调度的最小单元是线程

2.多线程有什么用?

  1. 发挥多核CPU的优势
    1. 如果使用多线程 将计算逻辑分配到多个处理器核心上 会减少程序处理时间
  2. 防止阻塞
  3. 一个业务内部需要多个业务配合完成 如果是单线程 就会发生执行一件后再执行另一件,如果是多线程 可以多个业务逻辑 并发执行 快速响应用户请求 缩短响应时间
  4. 便于建模
  5. 比如有一个大任务 特别复杂 可以分解成多个小任务

分别建立程序模型,并通过多线程分别运行这几个任务 那就简单很多了。

3.什么是线程的优先级

在多线程运行的过程中,操作系统会分出一个个的时间片,当线程的时间片用完了就会发生线程调度,并等待下次分配。线程分配到多少时间片也就决定了线程使用处理器资源的多少,线程的优先级就是决定线程需要多少或者分配多少处理器资源的线程属性

通过priority控制 线程创建时 setPriority() 修改优先级 1-10 针对频繁阻塞的线程 设置较高的优先级 偏重计算的 设置较低的优先级 确保处理器不会被独占

4.线程有几种状态

1.new 初始化状态 线程被创建 但还没有调用start方法

2.runnable 运行状态 就绪和运行两种状态统称位运行中

3.blocked 阻塞状态 表示线程阻塞与锁

4.waiting 等待状态 表示线程进入了等待状态 当前线程需要等待其他线程做出一些特定的动作 通知或者中断

5.time_waiting 超时等待状态 指定时间自行返回

6.terminated 终止状态 表示 线程一件执行完毕

5.什么是Deamon线程

在程序中后台调度的线程 被用作完成一些支持性工作

如果java中已经没有了非deamon线程 则虚拟机就会退出

6.启动和终止线程

1.集成Thread类

2. 实现Runnable接口

3.Callable和Future创建线程

实现接口的方式比继承类的方式更灵活

启动 用start()方法

含义:当前线程同步告知java虚拟机,只要线程规划器空闲,应立即启动调用start()方法的线程。

线程中断:

调用线程的interrupt()方法进行中断

通过isIntterrupt()判断是否被中断

调用Thread.interrupted()对当前的中断标识进行复位。如果线程已经被终结 即使被中断过 在调用isIntterrupt()时也是返回false

7.过期的suspend() resume() stop()方法 暂停 恢复 停止

原因 suspend()调用后线程不会释放已经占有的资源(锁) 容易发生死锁。

被以后的等待/通知等机制来代替

8.安全的终止线程

通过设置标志位

通过调用interrupt()

 

private volatile boolea on = true;

public void run(){

while(on && !Thread.currentThread().isInterruped()){

i++;

}

}

public void cancel(){

on =false;

}

通过调用cancel()来终止线程

通过次方式终止时 线程会有时间去清理资源

9.线程间通信

每个线程都有自己的栈空间

如果每个线程孤立运行 没有什么价值

1.对变量 加volatile关键字

告知程序 任何程序对该变量的访问都要从共享内存中去获取,对它的任何修改都要同步刷新回共享内存中。保证了它对所有线程的可见性。

如果过多的使用volatile 回降低程序执行的效率。

2.通过关键字 synchronized 修饰方法或者同步快

确保多个线程在同一时刻 只能有一个线程处于方法或者同步块中,它保证了线程对变量访问的可见性和排他性。

10.等待和通知

wait() 调用该方法的线程进入waiting状态 只有等待另外线程的通知或被中断才会返回,调用次方法会释放对象锁。

wait(long) 超时等待一段时间,参数 毫秒 如果没有通知就超时返回。

wait(long int)对超时时间更加细粒度控制 可以达到纳秒。

notify() 通知一个在对象上等待的线程,使其从wait()方法返回,返回的前提是该线程获取了对象的锁。

notifyAll() 通知所有等待在该对象上的线程。

经典范式

等待方:

  1. 获取对象锁
  2. 如果条件不满足,那么调用对象的wait()方法,被通知后仍要检查条件
  3. 条件满足 则执行对应逻辑

synchronized(对象){

while(条件不足){

对象.wait();

}

对应的处理逻辑

}

 

通知方:

1.获得对象的锁。

2.改变条件

3.通知所有等待在对象上的线程

synchronized(对象){

改变条件

对象.notifyAll();

}

11. Thread.join() 当前线程等待thread线程终结之后才从thread.join()返回。

与上面的等待通知机制一个原理

12.ThreadLocal的使用

线程变量 以ThreadLocal对象为键 任意对象为值 存储的存储结构

一个线程可以根据一个ThreadLocal对象擦好像到绑定在这个线程的值

13.等待超时模式

 

等待时间

synchronized(对象){

将来时间=当前时间+等待时间

while(条件不足&&等待时间>0){

对象.wait(等待时间);

等待时间=将来时间-当前时间

}

对应的处理逻辑

 

14.线程安全的概念

当多个线程访问某个类(对象或方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或方法)是安全的。

 

15.lock接口

锁是用来控制多个线程访问共享资源的方式 ,一般来说 一个锁能防止多个线程同事访问共享资源。排它锁。

lock具备synchronized关键字不具备的主要特征:

尝试非阻塞地获取锁

能被中断地获取锁 能够响应中断 当获取到锁的线程被中断时 中断已超将被抛出 并释放锁

超时获取锁 在指定的时间之前获取锁 如果时间到了 无法获取则返回

lock基本操作

lock() 获取锁

lockInterruptibly()可中断获取锁 就是获取锁后 可以响应中断。

tryLock() 尝试非阻塞的获取锁 获取到则返回true 否则返回false

tryLock(time,unit)超时获取锁 1在设置时间内获得锁 2 在设置时间内被中断 3 超时 结束 返回false

unlock() 释放锁

newCondition() 获取等待通知组件 该组件和当前的锁绑定 当前线程只有获得锁 才能调用该组件的wait()方法 而调用后 当前线程将锁释放掉。

 

多个线程多个锁:多个线程每个线程都可以拿到自己指定的锁 获得锁后 再执行synchronized方法体的内容 在静态方法上加锁 等于在这个类上加锁

原子性 一致性 隔离性 永久性

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

  1. java多线程学习笔记——详细

    一.线程类  1.新建状态(New):新创建了一个线程对象.        2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中, ...

  2. JAVA多线程学习笔记(1)

    JAVA多线程学习笔记(1) 由于笔者使用markdown格式书写,后续copy到blog可能存在格式不美观的问题,本文的.mk文件已经上传到个人的github,会进行同步更新.github传送门 一 ...

  3. Java多线程学习笔记(一)——多线程实现和安全问题

    1. 线程.进程.多线程: 进程是正在执行的程序,线程是进程中的代码执行,多线程就是在一个进程中有多个线程同时执行不同的任务,就像QQ,既可以开视频,又可以同时打字聊天. 2.线程的特点: 1.运行任 ...

  4. 多线程学习笔记九之ThreadLocal

    目录 多线程学习笔记九之ThreadLocal 简介 类结构 源码分析 ThreadLocalMap set(T value) get() remove() 为什么ThreadLocalMap的键是W ...

  5. 《深入理解Java虚拟机》学习笔记

    <深入理解Java虚拟机>学习笔记 一.走近Java JDK(Java Development Kit):包含Java程序设计语言,Java虚拟机,JavaAPI,是用于支持 Java 程 ...

  6. JavaEE精英进阶课学习笔记《博学谷》

    JavaEE精英进阶课学习笔记<博学谷> 第1章 亿可控系统分析与设计 学习目标 了解物联网应用领域及发展现状 能够说出亿可控的核心功能 能够画出亿可控的系统架构图 能够完成亿可控环境的准 ...

  7. Java:NIO 学习笔记-3

    Java:NIO 学习笔记-3 根据 黑马程序员 的课程 JAVA通信架构I/O模式,做了相应的笔记 3. JAVA NIO 深入剖析 在讲解利用 NIO 实现通信架构之前,我们需要先来了解一下 NI ...

  8. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  9. Java安全防御学习笔记V1.0

    Java安全防御学习笔记V1.0http://www.docin.com/p-766808938.html

随机推荐

  1. Hibernate 第一个体验程序

    首先要导入包,将下载的hibernate所有required包导入,将下载的hibernate用来写log的slf4j的api和nopjar包导入,将下载的mysql链接引擎jar包导入. 然后新建j ...

  2. NET框架 Castle

    Castle是针对.NET平台下的一个非常优秀的开源项目,从数据访问框架 ORM到依赖注入容器,再到WEB层的MVC框架.AOP,基本包括了整个开发过程中的所有东西,为我们快速的构建企业级的应用程序提 ...

  3. Objective-C之定义函数

    Demo1.m 一个基础的函数定义 #import<Foundation/Foundation.h> //定义一个返回值为int类型的,名为max的函数.传入的参数为两个int型数据 in ...

  4. 关于JSP和HTML

    工作中,发现非常多同事不清楚JSP与HTML的生命周期.以至于出现"JavaScript为啥不能调用JSTL标签(或EL表达式)?"的笑话问题. 以下以流程图的方式.简单说明一下过 ...

  5. C# Interview Questions:C#-English Questions

    This is a list of questions I have gathered from other sources and created myself over a period of t ...

  6. Eclipse添加中文语言包与下载

    从Eclipse官网下载最新版本的Eclipse都是英文版的,不自带语言包.现在Eclipse有一个语言包项目,叫Eclipse Babel Project.如果需要语言包,可以联机从这儿下载. Ba ...

  7. 分布式系统的CAP和BASE理论

    1. 背景 网络分区:俗称“脑裂”.当网络发生异常情况,导致分布式系统中部分节点之间的网络延时不断变大,最终导致组成分布式系统的所有节点中,只有部分节点之间能够进行正常通信,而另一些节点则不能. 当网 ...

  8. 使用GitHub做个人博客

    前言 用过市面上主流的blog程序,也用Django自己写过开源的博客程序July(170+Star),慢慢的发现没太多精力去打理维护,干脆直接放GitHub当静态页面算了,之前也用过Hexo.jek ...

  9. EL表达式从数组 Map List集合取值

    Jstl是sun的标准taglib库,Jstl是标签库和el语言的结合. el 表达式的隐含对象pageScope,requestScope,sessionScope,applicationScope ...

  10. Javascript网页截屏的方法

    最近我在研究开发一个火狐插件,具体的功能是将网页内容截屏并分享到微博上.目前基本功能已经实现,大家可以在 @程序师视野 里看到用这个截图插件分享的微博的效果. 之前我曾写过如何将canvas图形转换成 ...