线程

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

 为什么要使用多线程

  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. 封装sqlhelper类

    using System;using System.Collections.Generic;using System.Data;using System.Data.Common;using Syste ...

  2. mysql中varchar和char区别(思维导图整理)

    由于mysql一直是我的弱项(其实各方面我都是很弱的),所以最近在看msyql,正好看到varchar和char区别,所以整理一下,便于以后遗忘. 0.0图片已经说明一切,但是系统说我字数不够,我真能 ...

  3. Xmemcached学习笔记

    memcached有三种java客户端 第一种:Com.danga 包下面的memcached,需引入jar(本人用的是memcached-2.5.2.jar 文末附上附件需要的可以下载) 第二种:s ...

  4. spring boot 登录注册 demo (二) -- 数据库访问

    通过data-jpa来访问数据库 <dependency> <groupId>org.springframework.boot</groupId> <arti ...

  5. 【Ubuntu 16】安装nginx

    近年来,nginx服务器程序由于负载均衡.反向代理.适于高并发的特性,获得越来越多互联网企业的青睐.在此为大家奉上nginx的安装过程,以供参考. 一.安装nginx 1.安装gcc\g++库 sud ...

  6. 文本排序的王者:玩透sort命令

    本文目录: 1.1 选项说明 1.2 sort示例 1.3 深入研究sort sort是排序工具,它完美贯彻了Unix哲学:"只做一件事,并做到完美".它的排序功能极强.极完整,只 ...

  7. Java基础二

    1 关键字 定义:被java语言赋予了特殊含义的单词. 特点:关键字中的所有字母都为小写. 用于定义数据类型的关键字 class.interface.byte.short.int.long.float ...

  8. Apache与Tomcat的关系和区别 -个人比较

    我们经常在用apache和tomcat等这些服务器,可是总感觉还是不清楚他们之间有什么关系,在用tomcat的时候总出现apache,总感到迷惑,到底谁是主谁是次,因此特意在网上查询了一些这方面的资料 ...

  9. [读书笔记] 二、条件注解@Conditional,组合注解,元注解

    一.条件注解@Conditional,组合注解,元注解 1. @Conditional:满足特定条件创建一个Bean,SpringBoot就是利用这个特性进行自动配置的. 例子: 首先,两个Condi ...

  10. centos 7 最小安装后 ip配置

    安装玩CentOS7 后要进行 ip的配置 vi /etc/sysconfig/network-scripts/ifcfg-eth0 在里面输入 NAME=eth0 HWADDR=XX:XX:XX:X ...