线程

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

 为什么要使用多线程

  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. HttpRequest 类

    关于此类的介绍:查看HttpRequest类 点击查看:HttpRequest中方法的封装 跟这个类对应的HttpResponse类 定义:使 ASP.NET 能够读取客户端在 Web 请求期间发送的 ...

  2. Nagios部署与配置

    Nagos是一款开源电脑系统和网络监视工具,能够有效监控windows,linux,Uninx的主机状态,交换机路由器等网络设置,打印机等.在系统或服务状态异常时发出邮件或短信报警第一时间通知运维人员 ...

  3. MacOS下安装gdb、mgo

    安装gdb:http://blog.panks.me/posts/2013/11/install-gdb-on-os-x-mavericks-from-source/ 注意最后两步: killall ...

  4. CharMatch(括号匹配)

    用自己定义的链栈实现括号匹配 #include"LinkStack.h" bool Match(char *s) { LinkStack<char> tmpS; cha ...

  5. getNextElement( )函数——获取下一个特定的元素节点

    function getNextElement(node){ //定义getNextElement()函数 if (node.nodeType==){ //条件:如果node参数nodetype属性为 ...

  6. 阅读:DBA们不得不知的数据库硬件RAID常识

    对于数据库这种特殊应用IOPS往往会成为瓶颈,突破的这个瓶颈的有效方法不多,软件方面主要是读写分离,垂直拆分,分区表技术,cluster.硬件方面主要是raid,和SSD. 通常都是软件和硬件同时优化 ...

  7. shell /bin/bash^M: bad interpreter错误解决

      错误原因之一很有可能是你的脚本文件是DOS格式的, 即每一行的行尾以\r\n来标识, 其ASCII码分别是0x0D, 0x0A.可以有很多种办法看这个文件是DOS格式的还是UNIX格式的, 还是M ...

  8. MBProgressHUD1.0.0源码解析

    MBProgressHUD是一个显示提示窗口的三方库,常用于用户交互.后台耗时操作等的提示.通过显示一个提示框,通知用户操作或任务的执行状态:同时,利用动画效果,降低用户等待的焦虑心理,增强用户体验. ...

  9. fs模块(一)

    模块的使用,必须先引入模块 var fs = require('fs'); 1. readFile 和 readFileSync var fs = require('fs'); //01 readFi ...

  10. EasuUI-js(EasyUI formatter格式化教程) 判断常用:

    EasuUI-js(EasyUI formatter格式化教程) 判断常用: 1.YN标记: formatter : function(c1, row,index) { var a = "& ...