Java JUC(一) - 初识JUC、进程与线程

Java JUC(一) - 初识JUC、进程与线程

Java JUC - 初识JUC

JUC

JUC是java.util.concurrent工具包的简称,这是一个处理线程的工具包,出现于JDK1.5.

进程

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。

摘自:百度百科

线程

线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。

摘自:百度百科

线程的状态

通过java.lang.Thread.State,了解到,进程的状态有6:

  1. NEW新建
  2. RUNNABLE可运行
  3. BLOCKED阻塞
  4. WAITING等待
  5. TIMED_WAITING定时等待
  6. TERMINATED已终止

sleep和wait

  • sleepThread的静态方法;waitObject的方法,任何对象和实例都能调用。
  • sleep不会释放锁,它也不需要占用锁;wait会释放锁,但调用它的前提是当前线程占有锁,并且在锁代码块里如:synchronized中。
  • 它们都可以被interrupted方法中断。

并发与并行

串行模式

串行表示所有任务都一一按先后顺序进行,一次只能取得并执行一个任务,如:把大象放入冰箱要几个步骤。(玩笑)

并行模式

并行意味着可以同时取得多个任务,并同时去执行所取得的这些任务。并行模式相当于多条流水线,每条流水线都各自执行自己的任务。
并行的效率从代码层次上强依赖于多进程/多线程代码,从硬件角度上则依赖于多核CPU。

并发

并发(concurrent)指的是多个程序可以同时运行的现象,更细化的是多进程可以同时运行或多指令可以同时运行。同一时刻多个线程在访问同一个资源,多个线程对一个点。

管程

管程(monitor监视器)即“锁”,是一种同步机制,保证在同一时间内只有一个线程访问被保护的数据或者代码。
JVM同步基于使用管程对象实现的进入和退出

用户线程:自定义线程

final Thread customThread = new Thread(() -> {
    try {
        TimeUnit.SECONDS.sleep(1L);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println(Thread.currentThread().getName() + "\t" + Thread.currentThread().isDaemon());
    while (true) {
    }
}, "custom");
customThread.setDaemon(true);
customThread.start();
System.out.println(Thread.currentThread().getName() + "\t done");

控制台输出:

main done
custom false

通过执行上面代码,发现虽然主线程结束了,但是用户线程还在运行,所以整个JVM不会关闭。

守护线程:如垃圾回收

final Thread customThread = new Thread(() -> {
    try {
        TimeUnit.SECONDS.sleep(1L);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println(Thread.currentThread().getName() + "\t" + Thread.currentThread().isDaemon());
    while (true) {
    }
}, "custom");
customThread.setDaemon(true);
customThread.start();
System.out.println(Thread.currentThread().getName() + "\t done");

控制台输出:

main done

此时已经没有用户线程了,都是守护线程,主线程执行完毕后JVM也随之关闭。

# Java  基础  JUC 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×