从有点基础来学JUC:基本概念

134 阅读4分钟

基本概念

什么是JUC

首先让我们来看看什么是JUC?

简单来说,JUC就是java.util.concurrent包的简称,这是一个专门处理线程的工具包,在JDK1.5就开始出现了。

进程和线程

既然JUC是一个专门处理线程的工具包,那么我们就要来了解一下关于线程的基本概念,既然要了解线程了,那最好也看看什么是进程

  • 进程:一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间,一个进程可以有多个线程,是操作系统资源分配的基本单位

  • 线程:进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可共享数据,是处理器任务调度和执行的基本单位

  • 影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮

    注意:多线程存在一个特性:随机性。造成的原因:CPU在瞬间不断切换去处理各个线程而导致的,可以理解成多个线程在抢CPU资源。

线程的状态

为了方便以后的学习,我们有必要了解一下java中线程的状态,这部分我们直接上源码

public enum State {
        /**
         * Thread state for a thread which has not yet started.
         * 尚未启动的线程的线程状态。
         */
        NEW,
​
        /**
         * Thread state for a runnable thread.  A thread in the runnable
         * state is executing in the Java virtual machine but it may
         * be waiting for other resources from the operating system
         * such as processor.
         * 可运行线程的线程状态。处于可运行状态的线程正在Java虚拟机中执行,
         * 但它可能正在等待来自操作系统(如处理器)的其他资源。
         */
        RUNNABLE,
​
        /**
         * Thread state for a thread blocked waiting for a monitor lock.
         * A thread in the blocked state is waiting for a monitor lock
         * to enter a synchronized block/method or
         * reenter a synchronized block/method after calling
         * {@link Object#wait() Object.wait}.
         * 等待监视器锁的线程的线程状态。处于阻塞状态的线程正在等待监视器锁进入同步块方法或在调用         * Object.wait后重新进入同步块方法。
         *
         * 阻塞
         */
        BLOCKED,
​
        /**
         * Thread state for a waiting thread.
         * A thread is in the waiting state due to calling one of the
         * following methods:
         * <ul>
         *   <li>{@link Object#wait() Object.wait} with no timeout</li>
         *   <li>{@link #join() Thread.join} with no timeout</li>
         *   <li>{@link LockSupport#park() LockSupport.park}</li>
         * </ul>
         *
         * <p>A thread in the waiting state is waiting for another thread to
         * perform a particular action.
         *
         * For example, a thread that has called <tt>Object.wait()</tt>
         * on an object is waiting for another thread to call
         * <tt>Object.notify()</tt> or <tt>Object.notifyAll()</tt> on
         * that object. A thread that has called <tt>Thread.join()</tt>
         * is waiting for a specified thread to terminate.
         * 等待线程的线程状态。由于调用了以下方法之一,线程处于等待状态:
         * - Object.wait with no timeout
         * - Thread.join with no timeout
         * - LockSupport.park
         * 处于等待状态的线程正在等待另一个线程执行特定的操作。
         * 例如,在一个对象上调用object. wait()的线程正在等待另一个线程在该对象上调用object. 
         * notify()或object. notifyall()。
         * 调用thread .join()的线程正在等待指定的线程终止。
         *
         * wait/join/park方法进入无限等待,通过notify/notifyAll/unpark唤醒
         */
        WAITING,
​
        /**
         * Thread state for a waiting thread with a specified waiting time.
         * A thread is in the timed waiting state due to calling one of
         * the following methods with a specified positive waiting time:
         * <ul>
         *   <li>{@link #sleep Thread.sleep}</li>
         *   <li>{@link Object#wait(long) Object.wait} with timeout</li>
         *   <li>{@link #join(long) Thread.join} with timeout</li>
         *   <li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li>
         *   <li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li>
         * </ul>
         * 指定等待时间的等待线程的线程状态。线程处于定时等待状态,
         * 因为调用了以下方法之一,并指定了正等待时间:
         * - Thread.sleep
         * - Object.wait with timeout
         * - Thread.join with timeout
         * - LockSupport.parkNanos
         * - LockSupport.parkUntil
         *
         * 设置等待时间,时间到了自动唤醒
         */
        TIMED_WAITING,
​
        /**
         * Thread state for a terminated thread.
         * The thread has completed execution.
         * 终止线程的线程状态。线程已完成执行。
         */
        TERMINATED;
    }

wait()和sleep()

说完线程的状态,我们来看看和线程状态有关的方法,我们这里主要来看看wait()和sleep()方法,这是两个比较容易混淆的方法,至于其他的,我们用到再说

  • wait():Object类的方法,会释放锁,当调用前提为当前线程占有锁
  • sleep():Thread类的静态方法,不会释放锁,也不会占用锁
  • 共同点:都可以被interrupted()方法中断;在哪睡在哪醒

并发和并行

最后,作为基本概念的收尾,我们有必要了解一下并发和并行

  • 串行:一个个执行,一个结束,一个再开始,按照一定顺序
  • 并发:是指一个处理器同时处理多个任务。在同一时刻,有多条指令在多个处理器上同时执行,指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。
  • 并行:是指多个处理器或者是多核的处理器同时处理多个不同的任务。
  • 并发是逻辑上的同时发生(simultaneous),而并行是物理上的同时发生。

这就是这篇文章的内容了,欢迎大家的讨论,如有错漏,也请指出,谢谢~