java 多线程(0) Java线程
线程
线程是系统调度的基本单元,每当创建一个进程时,会有许多的线程,也叫轻量级进程,在一个进程中拥有多个线程,各自都有自己的计数器,堆和局部变量属性,并且能够分享内存变量.
为什么要使用多线程
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线程的更多相关文章
- Java多线程系列--“JUC线程池”06之 Callable和Future
概要 本章介绍线程池中的Callable和Future.Callable 和 Future 简介示例和源码分析(基于JDK1.7.0_40) 转载请注明出处:http://www.cnblogs.co ...
- Java多线程系列--“JUC线程池”03之 线程池原理(二)
概要 在前面一章"Java多线程系列--“JUC线程池”02之 线程池原理(一)"中介绍了线程池的数据结构,本章会通过分析线程池的源码,对线程池进行说明.内容包括:线程池示例参考代 ...
- Java多线程系列--“JUC线程池”04之 线程池原理(三)
转载请注明出处:http://www.cnblogs.com/skywang12345/p/3509960.html 本章介绍线程池的生命周期.在"Java多线程系列--“基础篇”01之 基 ...
- Java多线程系列--“JUC线程池”05之 线程池原理(四)
概要 本章介绍线程池的拒绝策略.内容包括:拒绝策略介绍拒绝策略对比和示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3512947.html 拒绝策略 ...
- java多线程系列(六)---线程池原理及其使用
线程池 前言:如有不正确的地方,还望指正. 目录 认识cpu.核心与线程 java多线程系列(一)之java多线程技能 java多线程系列(二)之对象变量的并发访问 java多线程系列(三)之等待通知 ...
- Java多线程核心技术(六)线程组与线程异常
本文应注重掌握如下知识点: 线程组的使用 如何切换线程状态 SimpleDataFormat 类与多线程的解决办法 如何处理线程的异常 1.线程的状态 线程对象在不同运行时期有不同的状态,状态信息就处 ...
- 转:java多线程CountDownLatch及线程池ThreadPoolExecutor/ExecutorService使用示例
java多线程CountDownLatch及线程池ThreadPoolExecutor/ExecutorService使用示例 1.CountDownLatch:一个同步工具类,它允许一个或多个线程一 ...
- Java多线程之守护线程
Java多线程之守护线程 一.前言 Java线程有两类: 用户线程:运行在前台,执行具体的任务,程序的主线程,连接网络的子线程等都是用户线程 守护线程:运行在后台,为其他前台线程服务 特点:一旦所有用 ...
- 温故知新-java多线程&深入理解线程池
文章目录 摘要 java中的线程 java中的线程池 线程池技术 线程池的实现原理 简述 ThreadPoolExecutor是如何运行的? 线程池运行的状态和线程数量 任务执行机制 队列缓存 Wor ...
- Java多线程系列--“JUC线程池”02之 线程池原理(一)
概要 在上一章"Java多线程系列--“JUC线程池”01之 线程池架构"中,我们了解了线程池的架构.线程池的实现类是ThreadPoolExecutor类.本章,我们通过分析Th ...
随机推荐
- 学问Chat UI(1)
前言 由于项目需要,最近开始借鉴学习下开源的Android即时通信聊天UI框架,为此结合市面上加上本项目需求列了ChatUI要实现的基本功能与扩展功能. 融云聊天UI-Android SDK 2.8. ...
- Learn c language the one day
第一个c程序 #include<stdio.h> int main() { ; ; printf_s("请输入两个数字:"); scanf_s("%d,%d& ...
- 纯CSS实现垂直居中的7种方法
今天申请博客通过了,给大家讲讲我所看到过的纯css实现垂直居中的各种方法.为什么要把它作为第一篇文章呢?因为这是我刚开始接触前端学到的对我最有用的知识,希望大家也可以从中获益! 在CSS中实现水平居中 ...
- PL/SQL 编程(一)基础,变量,分支,循环,异常
SQL和PL/SQL: SQL 结构化查询语言(Structural Query Language),是用来访问和操作关系型数据库的一种标准通用语言,属于第四代语言(4GL).可以方便的调用相应语句来 ...
- 使用pg_upgrade工具为PostgreSQL进行版本升级
公司的测试环境和生产环境都是9.2.4版本,而开发环境是9.0.18版本. PS: 不知道公司里的其它同事,是如何做数据库迁移的,利用第三方可视化工具备份数据库,然后恢复到其它高版本的环境?反正我没成 ...
- python学习之字符串(上)
字符串python 的字符串被划归为不可变序列这一类别,意味着这些字符串所包含的字符存在从左至右的位置顺序,并且他们不可以在原处修改. 字符串常量单引号 'spam'双引号 "spam& ...
- MySQL表空间集
--MySQL表空间集 ----------------------2014-09-20 1. 收缩ibdata的方法,目前MySQL依然没有提供收缩ibdata的方法,只能重构,下面是5.7的步骤. ...
- MySQL的left,substr,instr截取字符串函数使用实例
原表:select * from pagereferrer;如下: 如何在这张表中,查询出按 URL分类的信息 ,例如:211.95.60.43:8080算一类信息,并按百分比显示.预期结 ...
- Android studio 使用问题汇总
使用android studio也有一段时间了,汇总了一下这段时间内遇到一些常见问题 一.字体大小问题 在android studio的使用过程中没有发现类似于Eclipse中的font选项,调节字体 ...
- noip普及组2007 奖学金
奖学金 描述 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金.期末,每个学生都有3门课的成绩:语文.数学.英语.先按总分从高到低排序,如果两个同学总分相同,再按语文成绩 ...