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()来获取

原文地址:https://www.cnblogs.com/EraserHead/p/6437452.html