0
点赞
收藏
分享

微信扫一扫

一、JUC-基础线程知识

一、Thread

  • 代码示例:
 public static void main(String[] args) {
        Thread t1 = new Thread(()->{

        },"t1");
        // private native void start0();native修饰的:调用的是c语言编写的本地方法,jvm里面的本地方法栈里面完成
        t1.start();;
    }

解析: 1、java线程是通过start方法启动的,主要内容在native方法的start0中 2、openjdk的写JNI(java本地接口)一般是一一对应的,Thread.java对应的就是Thread.c 3、start0其实就是JVM_StartStartThread。此时看源代码可以看到在jvm.h中找到了声明,jvm.cpp中有实现。

  • 源码路径 1.png

  • thread.c文件路径 2.png 3.png

  • jvm.cpp文件路径 4.png 传一个本地的java线程

  • 5.png

  • thread.cpp 6.png 总结:本地的java线程传给start0,最终是由jvm配合操作系统,底层由操作系统来分配一个原生的线程

二、多线程相关概念

1、1把锁:synchronized

2、两个并

1、并发

  • 是在同一个实体上的多个事件
  • 是在一台处理器上“同时”处理多个任务
  • 同一时刻,其实只有一个事件发生 秒杀

2、并行

  • 是在不同实体上的多个事件
  • 是在多台处理器上同时处理多个任务
  • 同一时刻,大家都在做事情,你做你的,我做我的,但是我们都在做 泡方便面:一边烧热水,一边撕调料包

3、并发vs并行

7.png

3、三个程

1、进程

简单的说,在系统中运行的一个应用程序就是一个进程,每一个进程都有它自己的内存空间和系统资源。

2、线程

被称为轻量级进程,在同一个进程内,会有一个或多个线程,是大多数操作系统进行时序调度的基本单元

3、管程

  • Monitor(监视器),也就是我们平时所说的锁

    • Monitor是一种同步机制,它的义务是保证同一时间内只有一个线程可以访问被保护的数据和代码
    • JVM中同步是基于进入和退出监视器对象来实现的,每个对象实例都会有一个Monitor对象。
    • Monitor对象和java对象一同创建并销毁,它的底层是由C++语言来实现的。
  • JVM第三版

    • 执行线程要求先成功持有管程,然后才能执行方法,最后当方法完成时释放管程。在方法执行期间,执行线程持有了管程,其他任何线程都无法再获取到同一个管程。

三、用户线程和守护线程

一般不做特别说明配置,默认都是用户线程

1、用户线程

  • 是系统的工作线程,他会完成这个程序需要完成的业务操作 8.png 部门领导

2、守护线程

  • 守护线程作为一个服务线程,没有服务对象就没有必要继续运行了,如果用户线程全部结束了,意味着程序需要完成的业务操作已经结束了,系统可以退出了。所以假如当系统只剩守护线程的时候,java虚拟机会自动退出。 部门秘书

3、判断是用户线程还是守护线程的属性

daemon属性:true:守护线程 false:用户线程 9.png

4、例子演示

package com.lori.juc2023.juc1;

import java.util.concurrent.TimeUnit;

//守护线程陪伴用户线程,用户线程各自独立
public  class ThreadBaseDemo {
    public  static void main(String[] args) {
        Thread t1 = new Thread(()->{
            System.out.println(Thread.currentThread().getName()+"************开始运行"+"\t"+(Thread.currentThread().isDaemon()?"守护线程":"用户线程"));
          while (true){

          }

            },"t1");
        // private native void start0();native修饰的:调用的是c语言编写的本地方法,jvm里面的本地方法栈里面完成
        t1.start();;
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println(Thread.currentThread().getName()+"\t"+(Thread.currentThread().isDaemon()?"守护线程":"用户线程"+"*********end"));
    }
}

10.png

package com.lori.juc2023.juc1;

import java.util.concurrent.TimeUnit;

//守护线程陪伴用户线程,用户线程各自独立
public  class ThreadBaseDemo {
    public  static void main(String[] args) {
        Thread t1 = new Thread(()->{
            System.out.println(Thread.currentThread().getName()+"************开始运行"+"\t"+(Thread.currentThread().isDaemon()?"守护线程":"用户线程"));
          while (true){

          }

            },"t1");
        // private native void start0();native修饰的:调用的是c语言编写的本地方法,jvm里面的本地方法栈里面完成
        t1.setDaemon(true);//设置t1为守护线程,当用户线程结束时,可以看出,守护线程也退出了。设置此属性必须再start之前,否则会报异常。
        t1.start();;
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println(Thread.currentThread().getName()+"\t"+(Thread.currentThread().isDaemon()?"守护线程":"用户线程"+"*********end"));
    }
}

11.png

举报

相关推荐

0 条评论