1、多线程回顾

时间:2020-05-23 18:20:08   收藏:0   阅读:51

1、什么是JUC

JUC大家可能听说过,它实际上 Java 提供的用于并发处理的工具包。如官方文档所示:

技术图片 

回顾以前

在以前的业务中,我们使用的代码:

1、Thread

2、Runnable:没有返回值、无法抛出异常、效率相比 Callable 较低!

3、Callable

技术图片 

  4、还有Locked锁

技术图片 技术图片 

 这些以前多多少少都有接触过。

 

开发环境的配置

1、创建一个Maven项目

2、导入lombok插件

<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.8</version>
    </dependency>
</dependencies>

3、使用JDK1.8

4、应用 lambda,需要配置3处

技术图片

技术图片

技术图片

技术图片

技术图片

2、线程和进程、并发和并行

线程和进程

解释

如果不能用一句话概括,可以说是掌握的不扎实。

进程:

线程:

 

Java可以开启线程?

对于 Java 而言,Thread,Runnable,Callable都可以开启线程。

重点:但是 Java 真的可以开启线程吗?不可以

为什么呢?因为:

接下来通过 Java 创建一个线程,来查看源码。

技术图片

点进去这个 start() 方法

    public synchronized void start() {
        /**
         * This method is not invoked for the main method thread or "system"
         * group threads created/set up by the VM. Any new functionality added
         * to this method in the future may have to also be added to the VM.
         *
         * A zero status value corresponds to state "NEW".
         */
        if (threadStatus != 0)
            throw new IllegalThreadStateException();

        /* Notify the group that this thread is about to be started
         * so that it can be added to the group‘s list of threads
         * and the group‘s unstarted count can be decremented. */
        group.add(this);

        boolean started = false;
        try {
            start0();  // 调用本地方法
            started = true;
        } finally {
            try {
                if (!started) {
                    group.threadStartFailed(this);
                }
            } catch (Throwable ignore) {
                /* do nothing. If start0 threw a Throwable then
                  it will be passed up the call stack */
            }
        }
    }
  // native:本地方法, c++
    private native void start0();

1、首先将线程加入线程组 group.add(this)。

2、调用 start0()方法启动线程。

3、而这个 start0()方法就是本地方法private native void start0()

 

线程有几种状态?

答案:6种,新生、运行、阻塞、等待、超时等待、终止;

public enum State {
    //新生 new
    NEW,

    //运行 runnable
    RUNNABLE,

    // 阻塞 blocked
    BLOCKED,

    // 等待,死死地等 waiting
    WAITING,

    // 超时等待 timed_waiting
    TIMED_WAITING,

    // 终止 terminated
    TERMINATED;
}

 

wait 和 sleep的区别

1、来自不同的类

wait => Object

sleep => Thread

2、关于锁的释放

wait:会释放锁;sleep:不会释放锁。

可以理解成sleep是抱着锁睡觉的,wait没有抱着锁

 

并发和并行

解析

并发:是多个线程共用同一份资源

并行:是多个人一起行走

如何查看CPU的逻辑处理器(表示可以同时开启的线程个数)

1、通过任务管理器

技术图片

2、桌面 -> 此电脑 -> 右击管理 -> 设备管理器 -> 点击右边窗口的处理器

技术图片

 3、程序员方式查看,通过代码

public class ThreadTest {
    public static void main(String[] args) {
        System.out.println(Runtime.getRuntime().availableProcessors());
    }
}

技术图片

并发编程的本质

充分利用 CPU 资源,在现在的二进制环境下,谁能充分利用CPU的资源,就可以有成果。

 

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!