java并发专题-线程介绍


今天介绍下并发中使用的线程概念

线程简介

  • 会创建一个Java进程。现代操作系统调度的最小单元是线程,也叫轻量级进程(Light WeightProcess),在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局部变量等属性,并且能够访问共享的内存变量。处理器在这些线程上高速切换,让使用者感觉到这些线程在同时执行
  • 多线程的优势:
    • 更多的处理器核心,充分利用
    • 更快的响应时间
    • 更好的编程模型
  • 线程优先级
    • 线程优先级就是决定线程需要多或者少分配一些处理器资源的线程属性
    • 线程优先级不能作为程序正确性的依赖,因为操作系统可以完全不用理会Java线程对于优先级的设定
  • 线程的状态:
    • NEW: 初始状态,还没调用start()
    • RUNNABLE: 运行状态
    • BLOCKED: 阻塞状态,阻塞于锁
    • WAITING: 等待状态
    • TIME_WAITING: 超时等待状态,可在制定时间内自行返回
    • TEARMINATED: 终止状态,执行完毕
  • Daemon线程
    • Daemon线程是一种支持型线程,因为它主要被用作程序中后台调度以及支持性工作。
    • 当一个Java虚拟机中不存在非Daemon线程的时候,Java虚拟机将会退出。可以通过调用Thread.setDaemon(true)将线程设置为Daemon线程

操作线程(启停)

  • 线程对象在初始化完成之后,调用start()方法就可以启动这个线程
  • 中断可以理解为线程的一个标识位属性,它表示一个运行中的线程是否被其他线程进行了中断操作。中断好比其他线程对该线程打了个招呼,其他线程通过调用该线程的interrupt()方法对其进行中断操作
  • suspend()、resume()和stop()方法完成了线程的暂停、恢复和终止工作,而且非常“人性化”。(这些API是过期的,不建议使用)
  • 中断状态是线程的一个标识位,而中断操作是一种简便的线程间交互方式,而这种交互方式最适合用来取消或停止任务。除了中断以外,还可以利用一个boolean变量来控制是否需要停止任务并终止该线程

线程间通信

  • volatile: 关键字volatile可以用来修饰字段(成员变量),就是告知程序任何对该变量的访问均需要从共享内存中获取,而对它的改变必须同步刷新回共享内存,它能保证所有线程对变量访问的可见性
  • synchronized:关键字synchronized可以修饰方法或者以同步块的形式来进行使用,它主要确保多个线程在同一个时刻,只能有一个线程处于方法或者同步块中,它保证了线程对变量访问的可见性和排他性
  • 等待/通知机制:是指一个线程A调用了对象O的wait()方法进入等待状态,而另一个线程B调用了对象O的notify()或者notifyAll()方法,线程A收到通知后从对象O的wait()方法返回,进而执行后续操作
  • 管道通信:管道输入/输出流和普通的文件输入/输出流或者网络输入/输出流不同之处在于,它主要用于线程之间的数据传输,而传输的媒介为内存,主要包括4种具体实现:PipedOutputStream、PipedInputStream、PipedReader和PipedWriter,前两种面向字节,而后两种面向字符
  • Thread.join() : 如果一个线程A执行了thread.join()语句,其含义是:当前线程A等待thread线程终止之后才从thread.join()返回。线程Thread除了提供join()方法之外,还提供了join(long millis)和join(longmillis, int nanos)两个具备超时特性的方法
  • ThreadLocal: 线程变量,是一个以ThreadLocal对象为键、任意对象为值的存储结构。这个结构被附带在线程上,也就是说一个线程可以根据一个ThreadLocal对象查询到绑定在这个线程上的一个值,可以通过set(T)方法来设置一个值,在当前线程下再通过get()方法获取到原先设置的值

线程应用

  • 数据库链接池
  • 线程池
  • 基于线程池的简单web服务器

文章作者: Xudong Jiang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Xudong Jiang !
 上一篇
weixin_小程序开发(一) weixin_小程序开发(一)
TODO
2018-09-15 Xudong Jiang
下一篇 
java-多线程-线程安全简单介绍 java-多线程-线程安全简单介绍
本文对多线程的线程安全做一个简单介绍和探讨。 在特定场景下,多线程是一把利刃,可以帮助我们提升业务处理的性能,充分利用服务器的性能,甚至在某些情况下会让编程从逻辑上更简单清晰。 但是他同时是一把双刃剑,我们早就习惯了艳丽的玫瑰总是带刺的
2018-07-22
  目录