线程

  线程是系统调度的基本单元,每当创建一个进程时,会有许多的线程,也叫轻量级进程,在一个进程中拥有多个线程,各自都有自己的计数器,堆和局部变量属性,并且能够分享内存变量.

 为什么要使用多线程

  1.更多的处理器核心

  2.更快的响应时间

  3.更好的编程模型

优先级

  线程优先级决定了线程需要多或少分配一些处理器资源的线程属性,通过priority来控制优先级,范围从1-10,在线程构建SetPriority(int)方法来修改优先级,默认为5.

线程的运行状态

 

状态名称 说明
NEW 初始状态,线程被构建,但还没有构建START()
RUNNABLE 运行状态,JAVA线程将操作系统中的就绪和运行,统称"运行中"
BLOCKED 阻塞状态,线程阻塞与锁
WAITING 等待状态,线程进入等待状态
TIME_WAITING 超时等待状态
TERMINATED 终止状态

在线程优先级中,JPS可以发现在自身的生命周期中,并不是固定的处于某个状态,而是随着代码执行在不同的状态之间切换

1-1线程运行状态

Daemon线程

  支持型线程,主要作用于程序后台调度以及支持性工作,当JVM不存在非DAEMON线程时,JVM将会退出,通过THREAD.SETDAEMON(TRUE)设置DAEMON线程

  !main线程随着daemoned方法之后MAIN终止.

Boot And Stop

  理解中断

  interrupt()对其进行中断,线程通过检查自身是否中断进行响应,也可以调用静态方法Thread.interrupted()对当前线程终端标识位进行复位.

过期的STOP(),RESUME(),SUSPEND()

  死锁导致不建议使用,suspend()方法在调用时不会释放已被占有的资源,而是占有资源进入休眠状态,stop()在终结线程不会保证线程正常释放,所以会导致程序工作在不确定状态中

Volatile

    用来修饰字段,告知程序任何变量的访问均需要从共享内存中获取,而对他的改变必须同步刷新回共享内存,保证所有线程对变量的可见性.

Synchronized

  可以修饰方法或者以同步块的形式使用保证多个线程在同一时刻,只能有一个线程处于方法的同步块中,保证了线程对变量访问的可见性和排他性.

  !任何线程对OBJECT的访问,首先要获取OBJECT的监视器,如果获取失败进入同步队列,状态为BLOCKED,当前驱释放了锁,释放操作唤醒阻塞在同步队列中的线程并且重新尝试访问

等待/通知机制

  while方法能够检查变量是否符合预期,但是存在着以下问题

  1.难以确保及时性.

  2.难以降低开销

  所以JAVA有内置的等待通知机制来确保矛盾的解决(JAVA.LANG.OBJECT)

  

等待/通知的相关方法
notify() 通知一个在等待得线程,从WAIT()返回
notifyAll() 通知全部在等待的线程
wait() 调用方法进入WAITING状态,只有等待线程通知或中断才会返回
WAIT(LONG) 超过等待一段时间,时间为MS
WAIIT(LONG,INT)  超时时间的控制,最低为纳秒
   

使用NOTIFY()或NOTIFYALL()需注意

  1.先对调用对象加锁

  2.调用WAIT()方法后,线程状态由RUNNING转变为WAITING,并将当前队列放到等待队列

  3.NOTIFY()或NOTIFYALL()方法调用后,等待线程依旧不会从WAIT()返回,需要调用NOTIFY()或者NOTIFYALL()线程释放之后,才有机会返回.

  4.notify()方法将等待队列移动到同步队列中,notifyAll()则将全部线程移动到同步队列中,移动状态从WAITING转变到BLOCKED

  5.wait()方法返回前题是获得调用对象的锁.

等待/通知经典范式

  等待

  1.获取对象的锁

  2.条件不满足时调用WAIT()

  3.条件满足执行

   通知

  1.获得对象锁

  2.改变条件

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

管道I/O流

  主要用于数据传输,媒介为内存

  主要包括: PipedOutputStream,PipedInputStream,PipedReader,PipedWriter

 步骤:

    connect(PIPEDREADER);

Thread.join()

  指当前线程等待Thread线程终止之后才从thread.join()返回,

ThreadLocal

  线程变量,以ThreadLocaL对象为键,任意对象为值得存储结构,被附带在线程中,一个线程可以根据一个ThreadLocal变量对象查询到绑定这个线程上的值

  通过SET(T)来设置一个值,get()来获取

java 多线程(0) Java线程的更多相关文章

  1. Java多线程系列--“JUC线程池”06之 Callable和Future

    概要 本章介绍线程池中的Callable和Future.Callable 和 Future 简介示例和源码分析(基于JDK1.7.0_40) 转载请注明出处:http://www.cnblogs.co ...

  2. Java多线程系列--“JUC线程池”03之 线程池原理(二)

    概要 在前面一章"Java多线程系列--“JUC线程池”02之 线程池原理(一)"中介绍了线程池的数据结构,本章会通过分析线程池的源码,对线程池进行说明.内容包括:线程池示例参考代 ...

  3. Java多线程系列--“JUC线程池”04之 线程池原理(三)

    转载请注明出处:http://www.cnblogs.com/skywang12345/p/3509960.html 本章介绍线程池的生命周期.在"Java多线程系列--“基础篇”01之 基 ...

  4. Java多线程系列--“JUC线程池”05之 线程池原理(四)

    概要 本章介绍线程池的拒绝策略.内容包括:拒绝策略介绍拒绝策略对比和示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3512947.html 拒绝策略 ...

  5. java多线程系列(六)---线程池原理及其使用

    线程池 前言:如有不正确的地方,还望指正. 目录 认识cpu.核心与线程 java多线程系列(一)之java多线程技能 java多线程系列(二)之对象变量的并发访问 java多线程系列(三)之等待通知 ...

  6. Java多线程核心技术(六)线程组与线程异常

    本文应注重掌握如下知识点: 线程组的使用 如何切换线程状态 SimpleDataFormat 类与多线程的解决办法 如何处理线程的异常 1.线程的状态 线程对象在不同运行时期有不同的状态,状态信息就处 ...

  7. 转:java多线程CountDownLatch及线程池ThreadPoolExecutor/ExecutorService使用示例

    java多线程CountDownLatch及线程池ThreadPoolExecutor/ExecutorService使用示例 1.CountDownLatch:一个同步工具类,它允许一个或多个线程一 ...

  8. Java多线程之守护线程

    Java多线程之守护线程 一.前言 Java线程有两类: 用户线程:运行在前台,执行具体的任务,程序的主线程,连接网络的子线程等都是用户线程 守护线程:运行在后台,为其他前台线程服务 特点:一旦所有用 ...

  9. 温故知新-java多线程&深入理解线程池

    文章目录 摘要 java中的线程 java中的线程池 线程池技术 线程池的实现原理 简述 ThreadPoolExecutor是如何运行的? 线程池运行的状态和线程数量 任务执行机制 队列缓存 Wor ...

  10. Java多线程系列--“JUC线程池”02之 线程池原理(一)

    概要 在上一章"Java多线程系列--“JUC线程池”01之 线程池架构"中,我们了解了线程池的架构.线程池的实现类是ThreadPoolExecutor类.本章,我们通过分析Th ...

随机推荐

  1. JVM学习笔记五:虚拟机类加载机制

    类加载生命周期 类加载生命周期:加载.验证.准备.解析.初始化.使用.卸载 类加载或初始化过程什么时候开始? 遇到new.getstatic.putstatic或invokestatic这4条字节码指 ...

  2. NYOJ 252 01串(斐波那契数列变形)

    01串 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 ACM的zyc在研究01串,他知道某一01串的长度,但他想知道不含有“11”子串的这种长度的01串共有多少个, ...

  3. 不重启修改mysql root密码

    不重启修改mysql root密码 --------------------2014/09/28 一.一般忘记密码的解决办法,需要重启Mysql1.skip-grant-tables我们常用的方法是使 ...

  4. ubuntu下动态链接库小计

    只记录下具体操作代码,以后再做补充 1,gcc -Wall -fPIC -c test4.c 2,gcc -g -shared -Wl,-soname,libtests.so -o libtests. ...

  5. statement和preparedstatement的区别

    在执行SQL命令时,我们有二种选择:可以使用PreparedStatement对象,也可以使用Statement对象.无论多少次地使用同一个SQL命令,PreparedStatement都只对它解析和 ...

  6. 浏览器支持播放的视频播放格式要求(H5的video标签)

    今天给一个客户上传视频后发现,即使是MP4格式的视频浏览器也打不开,找了好久的问题,最红发现客户视频的编码方式不是h5支持的,折腾了好久,最终确认了浏览器对于MP4编码方式的如下: 浏览器对mp4的编 ...

  7. Apache的配置文件http.conf参数含义详解

    Apache的配置由httpd.conf文件配置,因此下面的配置指令都是在httpd.conf文件中修改. 主站点的配置(基本配置) (1) 基本配置: ServerRoot "/mnt/s ...

  8. 7.21.02 switch语句

    switch语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支. 语法 switch语法格式如下: switch(expression) { case value : //语句 break ...

  9. 四种JavaScript隐式类型转换的总结

    一般存在四种情况,JavaScript会对变量的数据类型进行转换. 目录 * if中的条件会被自动转为Boolean类型 * 会被转为false的数据 * 会被转为true的数据 * 参与+运算都会被 ...

  10. Django编写RESTful API(五):添加超链接提高模型间的关联性

    前言 在第四篇中,加入了用户模型,以及相关的认证和权限的功能.但是我们在使用的时候,会发现在访问http://127.0.0.1:8000/users/时看到的用户列表,不能够直接点击某个链接然后查看 ...