基本概念
什么是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),而并行是物理上的同时发生。
这就是这篇文章的内容了,欢迎大家的讨论,如有错漏,也请指出,谢谢~