美文网首页
java多线程

java多线程

作者: 王古 | 来源:发表于2019-04-10 17:03 被阅读0次

新建

new() ,Thread()进程的子类,start()

就绪

等待JVM线程调度器的调度

运行

获取CPU资源 run()

阻塞

sleep(),suspend(挂起)

  • 等待阻塞:运行状态中的线程执行 wait() 方法,使线程进入到等待阻塞状态。

  • 同步阻塞:线程在获取 synchronized 同步锁失败(因为同步锁被其他线程占用)。

  • 其他阻塞:通过调用线程的 sleep() 或 join() 发出了 I/O 请求时,线程就会进入到阻塞状态。当sleep() 状态超时,join() 等待线程终止或超时,或者 I/O 处理完毕,线程重新转入就绪状态。

priority(优先级)

创建线程

  • 通过实现 Runnable 接口;

需要重写run(),同时也需要调用Thread的start()

public class MyRunnable implements Runnable {
    public void run() {
        // ...
    }
}

public static void main(String[] args) {
    MyRunnable instance = new MyRunnable();
    Thread thread = new Thread(instance);
    thread.start();
}
  • 通过继承 Thread 类本身;

同样也是需要实现 run() 方法,因为 Thread 类也实现了 Runable 接口

public class MyThread extends Thread {
    public void run() {
        // ...
    }
}

public static void main(String[] args) {
    MyThread mt = new MyThread();
    mt.start();
}

  • 通过 Callable 和 Future 创建线程。

  • 实现接口会更好一些,因为:

Java 不支持多重继承,因此继承了 Thread 类就无法继承其它类,但是可以实现多个接口

类可能只要求可执行就行,继承整个 Thread 类开销过大。

互斥同步

java通过两种锁机制来控制多个线程对共享资源的互斥访问
JVM的synchronized
JDK的ReentranLock

Thread的几个重要方法。

  • start()方法,调用该方法开始执行该线程
  • stop()方法,调用该方法强制结束该线程执行
  • join方法,调用该方法等待该线程结束
  • sleep()方法,调用该方法该线程进入等待
  • run()方法,调用该方法直接执行线程的run()方法,但是线程调用start()方法时也会运行run()方法,区别就是一个是由线程调度运行run()方法,一个是直接调用了线程中的run()方法

wait()与sleep()的区别:

  • 简单来说wait()会释放对象锁而sleep()不会释放对象锁

start()方法的调用后并不是立即执行多线程代码,而是使得该线程变为可运行态(Runnable),什么时候运行是由操作系统决定的。

阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:

  • 等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。(wait会释放持有的锁)
  • 同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
  • 其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。(注意,sleep是不会释放持有的锁)

notify(): 通知一个线程继续运行。

getID() : 获取线程的唯一标识

interrupt() : 停止线程,打一个停止的标记


Thread.currentThread().interrupted(); //中断程序
this.interrupted(); //是否已经中断,第一次调用之后状态标识便会被清除
this.isInterrupted(); //判断是否会中断,但是不会清除状态标识 

MyThread thread = new MyThread();
thread.start();
Thread.sleep();
thread.interrupt();

  1. stop() 暴力停止。可能会导致java.lang.ThreadDeath,已经过期了。
  2. 使用return停止线程
  • 暂停线程suspend();
  • 恢复线程resume();
  • 缺点就是不同步
  1. yieID() 放弃当前的CPU资源,,给其他任务去占用,放弃时间不确定

线程优先级的继承特性

A线程启动B线程,则B线程的优先级与A相同

为什么我们要调用Thread中的start()时才执行run()方法,而不是直接调用run()

调用start方法方可启动线程使得线程进入就绪状态,而run方法只是Thread线程中的一个普通调用,还是在主线程里面执行的

相关文章

  • 带你搞懂Java多线程(五)

    带你搞懂Java多线程(一)带你搞懂Java多线程(二)带你搞懂Java多线程(三)带你搞懂Java多线程(四) ...

  • 带你搞懂Java多线程(六)

    带你搞懂Java多线程(一)带你搞懂Java多线程(二)带你搞懂Java多线程(三)带你搞懂Java多线程(四)带...

  • Java多线程目录

    Java多线程目录 Java多线程1 线程基础Java多线程2 多个线程之间共享数据Java多线程3 原子性操作类...

  • java多线程--Callable

    **移步[java多线程系列文章]Java多线程(二十二)---LockSupport工具Java 停止线程 一、...

  • android 多线程 — 线程的面试题和答案

    这里都是我从各个地方找来的资料,鸣谢: Java多线程干货系列—(一)Java多线程基础 JAVA多线程和并发基础...

  • 5月份第一周学习安排

    学习内容: java多线程及线程同步的方法(使用) java多线程各种同步方法的原理和优缺点 java多线程设计模...

  • 带你搞懂Java多线程(四)

    带你搞懂Java多线程(一)带你搞懂Java多线程(二)带你搞懂Java多线程(三) 什么是线程间的协作 线程之间...

  • Java基础(六)

    多线程 Java多线程并发 1.1 JAVA 并发知识库 1.2 JAVA 线程实现/创建方式 1.2.1 继承 ...

  • (五) volatile关键字

    Java多线程目录 1 背景 理解Java多线程的内存抽象逻辑请阅读java多线程内存模型,当代操作系统,处理器为...

  • Java多线程高级特性(JDK8)

    [TOC] 一、Java多线程 1.Java多线程基础知识 Java 给多线程编程提供了内置的支持。一条线程指的是...

网友评论

      本文标题:java多线程

      本文链接:https://www.haomeiwen.com/subject/vqjoiqtx.html