Java之多线程

来源:互联网 发布:linux tgz 安装 编辑:程序博客网 时间:2024/06/08 10:32

程序、进程、线程

  1. 程序:指令集,静态概念
  2. 进程:操作系统,调用程序,动态概念
  3. 线程:在进程内多条执行路径

关键字和方法

volatile
可见性 JMM,happens-before原则
修饰变量,保证线程可以正确的读取其它线程写入的值。

public static void yield()
放弃当前资源,让出处理器时间

两种方式

继承Thread类:

class MyThread extends Thread {    @Override    public void run() {        // Java语句    }}MyThread mt = new MyThread();mt.start();

实现Runnable接口

避免 Java 单继承特性带来的缺陷。
适合于多个线程处理同一资源的情况。

class MyThread implements Runnable {    @Override    public void run() {        // Java语句    }}MyThread mt = new MyThread();Thread t = new Thread(mt);t.start();

生命周期

多线程生命周期

创建

用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态。
处于新生状态的线程有自己的内存空间,通过调用start方法进入就绪状态(runnable)。
注意:
不能对已经启动的线程再次调用start()方法,否则会出现
Java.lang.IllegalThreadStateException异常。

就绪

创建了线程对象后,调用了线程的start()方法(注意:此时线程只是进入了线程队列,等待获取CPU服务,具备了运行的条件,但并不一定已经开始运行了)

运行

处于就绪状态的线程,一旦获取了CPU资源,便进入到运行状态,开始执行run()方法里面的逻辑。

阻塞

一个正在执行的线程在某些情况下,由于某种原因而暂时让出了CPU资源,暂停了自己的执行,便进入了阻塞状态,如调用了sleep()方法。

终止

线程的run()方法执行完毕,或者线程调用了stop()方法(已过时),线程便进入终止状态。


ThreadLocal

ThreadLocal存放的值是线程封闭,线程间互斥的,主要用于线程内共享一些数据,避免通过参数来传递
线程的角度看,每个线程都保持一个对其线程局部变量副本的隐式引用,只要线程是活动的并且 ThreadLocal 实例是可访问的;在线程消失之后,其线程局部实例的所有副本都会被垃圾回收
在Thread类中有一个Map,用于存储每一个线程的变量的副本。
对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式


守护线程

运行在后台,为其它前台线程服务

特点

一旦所有用户线程都结束运行,守护线程会随JVM一起结束工作

应用

数据库连接池中的检测线程
JVM虚拟机启动后的检测线程
例:垃圾回收线程

注意事项

  • setDaemon(true)必须在start()方法之前调用,否则会抛
    IllegalThreadStateException异常。
  • 在守护线程中产生的新线程也是守护线程。
  • 不是所有的任务都可以分配给守护线程来执行,比如读写操作。

方法

resume与suspended一起使用
suspend()使得线程进入阻塞状态,并且不会自动恢复,必须其对应的 resume() 被调用,才能使得线程重新进入可执行状态

wait与notify(notifyAll)一起使用
sleep会让线程暂时不执行

其它

多线程与线程池

0 0
原创粉丝点击