1.JUC概述

JUC - 图1
JUC: java.utils.concurrent的简称
image.png
java.utils 工具包、包、分类
业务:普通线程代码 Thread
Runnable 没有返回值、效率相比于Callable相对较低。

2. 进程和线程

见多线程部分 对于Java来说,三种创建线程的方式:Thread、Runnable、Callable

Java真的可以开启线程么? 不可以

private native void start0(); 是通过调用本地方法来实现的,c++。Java无法直接操作硬件

并发编程:并发、并行
并发:多线程操作同一个资源

  • CPU一核,模拟出来多条线程,快速交替

并行:多个线程同时执行

  • CPU多核,多个线程可以同时执行
    1. public class Test1 {
    2. public static void main(String[] args) {
    3. //获取CPU核心数
    4. // CPU密集型,IO密集型
    5. System.out.println(Runtime.getRuntime().availableProcessors());
    6. }
    7. }

    线程有几个状态?

线程中的状态主要有6种:

  1. 初始(NEW):新创建了一个线程对象,但还没有调用start()方法。
  2. 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。
    线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得CPU时间片后变为运行中状态(running)。
  3. 阻塞(BLOCKED):表示线程阻塞于锁。
  4. 等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。
  5. 超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定的时间后自行返回。
  6. 终止(TERMINATED):表示该线程已经执行完毕。

线程状态图:
2018070117435683.jpg

wait与sleep之间的区别?

  1. 来自不同的类
    1. wait->Object
    2. sleep->Thread
  2. 关于所得释放
    1. wait会释放锁,sleep不会释放锁
  3. 使用范围不同
    1. wait只能在同步代码块中使用
    2. sleep方法可以在任何地方使用
  4. 是否需要捕获异常
    1. wait不需要
    2. sleep需要

2019050816141738.png