【Java】JUC并发编程-进程线程

一、什么是JUC

JUC是java.util.concurrent包的简称,在Java5.0添加,目的就是为了更好的支持高并发任务。让开发者进行多线程编程时减少竞争条件和死锁的问题!

二、进程和线程

一个进程中有多个线程

1、进程

进程是资源分配的最小单位

指在系统中正在运行的一个应用程序,程序一旦运行就是进程

2、线程

线程是程序执行的最小单位

系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元执行流

三、线程的六种状态

public enum State {
    
    
    // 新生
    NEW,

    // 运行
    RUNNABLE,

    // 阻塞
    BLOCKED,

    // 等待
    WAITING,

    //超时等待
    TIMED_WAITING,

    //终止
    TERMINATED;
}

四、wait与sleep的区别

  • sleep是Thread的静态方法,wait是Object的方法,任何对象实例都能调用
  • sleep不会释放锁,它也不需要占用锁。wait会释放锁,但调用它的前提是当前线程占有锁(即代码要在synchronized中)
  • 二者都可以被interrupted方法中断

五、并发与并行

并发:同一时刻多个线程在访问同一资源,多个线程对一个点
并行:多项工作一起执行,之后再汇总

1、串行模式

串行表示所有任务有一一按先后顺序进行。串行意味着必须先装完一车柴才能运送这车柴,只有运送到了,才能卸下这车柴,并且只有完成了这整个三个步骤,才能进行下一个步骤。

串行是一次只能取得一个任务,并执行这个任务

2、并行模式

并行意味着可以同时取得多个任务,并同时去执行所取得的这些任务。并行模式相当于将长长的一条队列,划分成了多条短队列,所以并行缩短了任务队列的长度。并行的效率从代码层次上强依赖于多线程/多线程代码,从硬件角度上则依赖于多核CPU

3、并发模式

并发指的是多个程序可以同时运行的现象,更细化的是多线程可以同时运行或者多指令可以同时运行

4、管程

管程(Monitor):在Java中称之为“锁”,在操作系统中称之为“监视器”。是一种同步机制,保证同一个时间,只有一个线程访问被保护的数据或者代码。
jvm同步基于进入和退出的过程中进行操作的,而进入和退出是使用管程对象实现的。每个对象都会有一个Monitor管程对象。而管程对象是会随着Java对象一起创建和销毁。

通俗来说的话就是:管程对象就是对我们的临界区进行加锁,进入时加锁,退出时解锁。进入退出通过管程对象进行管理

六、用户线程与守护线程

1、用户线程(自定义线程)

public static void main(String[] args) {
    
    
    Thread thread = new Thread(() -> {
    
    
        //isDaemon()表示是用户线程还是守护线程,如果值为true,则为守护线程,如果值为false,则为用户线程
        System.out.println(Thread.currentThread().getName() + "::" + Thread.currentThread().isDaemon());
        while (true) {
    
    

        }
    }, "thread");

    thread.start();
    System.out.println(Thread.currentThread().getName()+" over");
}

执行结果:主线程结束了,用户线程还在运行,说明jvm是存活的一个状态

在这里插入图片描述

2、守护线程(比如垃圾回收)

public static void main(String[] args) {
    
    
    Thread thread = new Thread(() -> {
    
    
        //isDaemon()表示是用户线程还是守护线程,如果值为true,则为守护线程,如果值为false,则为用户线程
        System.out.println(Thread.currentThread().getName() + "::" + Thread.currentThread().isDaemon());
        while (true) {
    
    

        }
    }, "thread");

    //设置守护线程
    //用户线程包括守护线程,在设置用户线程包括守护线程的时候,要写在start()方法之前
    thread.setDaemon(true);

    thread.start();
    System.out.println(Thread.currentThread().getName()+" over");
}

执行结果:没有用户线程了,都是守护线程,说明jvm结束

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45490023/article/details/131951975
今日推荐