2 线程基础知识复习

简介: 2 线程基础知识复习

1、并发相关Java包

  • 涉及到的包内容
  • java.util.concurrent
  • java.util.concurrent.atomic
  • java.util.concurrent.locks

2、并发始祖

3、start线程解读

  • 初始程序
public static void main(String[] args) {
        Thread t1 = new Thread(() ->{
        },"t1");
        t1.start();
    }
//start
    public synchronized void start() {
        /**
         * This method is not invoked for the main method thread or "system"
         * group threads created/set up by the VM. Any new functionality added
         * to this method in the future may have to also be added to the VM.
         *
         * A zero status value corresponds to state "NEW".
         */
        if (threadStatus != 0)
            throw new IllegalThreadStateException();
        /* Notify the group that this thread is about to be started
         * so that it can be added to the group's list of threads
         * and the group's unstarted count can be decremented. */
        group.add(this);
        boolean started = false;
        try {
            start0();
            started = true;
        } finally {
            try {
                if (!started) {
                    group.threadStartFailed(this);
                }
            } catch (Throwable ignore) {
                /* do nothing. If start0 threw a Throwable then
                  it will be passed up the call stack */
            }
        }
    }
private native void start0();//start0是一个native方法
  • native调用了本地方法,我们可以通过下载官网OpenJDK查看其源码
  • thread.c
  • java线程是通过start的方法启动执行的,主要内容在native方法start0中
    Openjdk的写JNI一般是一一对应的,Thread.java对应的就是Thread.c
    start0其实就是JVM_StartThread。此时查看源代码可以看到在jvm.h中找到了声明,jvm.cpp中有实现。
  • jvm.cpp
  • thread.cpp
  • 终于在这里调用了操作系统的线程启动,os::start_thread(thread);

3、Java多线程相关概念

1、1把锁

2、2个并(并发和并行)

①并发

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

②并行

是在不同实体上的多个事件,是在多台处理器上同时处理多个任务,同一时刻,大家都真的在做事情,你做你的,我做我的

并发VS并行

3、3个程(进程 线程 管程)

  • 3个程(进程 线程 管程)

①进程

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

②线程

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

③管程

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

Monitor其实是一种同步机制,他的义务是保证(同一时间)只有一个线程可以访问被保护的数据和代码。

JVM中同步是基于进入和退出监视器对象(Monitor,管程对象)来实现的,每个对象实例都会有一个Monitor对象,

Monitor对象会和Java对象一同创建并销毁,它底层是由C++语言来实现的。

进程VS线程

进程是…,线程是…,进程和线程的最大不同在于进程基本上是独立的,而线程不一定,线程共享方法区和堆,线程私有栈、本地方法栈和程序计数器

4、用户线程和守护线程

Java线程分为用户线程和守护线程

  • 线程的daemon属性为
- true表示是守护线程
  - false表示是用户线程。

用户线程

是系统的工作线程,它会完成这个程序需要完成的业务操作

守护线程

是一种特殊的线程,为其他线程服务的,在后台默默地完成一些系统性的服务,比如垃圾回收线程。

总结

public class DaemonDemo
{
public static void main(String[] args)
{
    Thread t1 = new Thread(() -> {
        System.out.println(Thread.currentThread().getName()+"\t 开始运行,"+(Thread.currentThread().isDaemon() ? "守护线程":"用户线程"));
        while (true) {
        }
    }, "t1");
    //线程的daemon属性为true表示是守护线程,false表示是用户线程
    //---------------------------------------------
    t1.setDaemon(true);
    //-----------------------------------------------
    t1.start();
    //3秒钟后主线程再运行
    try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); }
    System.out.println("----------main线程运行完毕");
}
}
  • 两种情况

1、未加t1.setDaemon(true);,默认是用户线程,他会继续运行,所以灯亮着

2、加了t1.setDaemon(true);是守护线程,当用户线程main方法结束后自动退出了

  • 守护线程作为一个服务线程,没有服务对象就没有必要继续运行了,如果用户线程全部结束了,意味着程序需要完成的业务操作已经结束了,系统可退出了。假如当系统只剩下守护线程的时候,java虚拟机会自动退出。
  • setDaemon(true)方法必须在start()之前设置,否则报IIIegalThreadStateException异常
相关文章
|
2天前
|
Java 程序员 调度
【并发编程】线程基础知识
【并发编程】线程基础知识
6 0
|
6月前
|
Java 程序员 调度
【Java之家-编程的衣柜】线程的基础知识及线程与进程的联系
【Java之家-编程的衣柜】线程的基础知识及线程与进程的联系
37 0
|
10月前
|
缓存 Java 程序员
【Java基础】线程相关基础知识
cpu核心数指cpu 内核数量,如双核、四核、八核。 cpu线程数是一种逻辑的概念,就是模拟出的cpu核心数,
|
12月前
|
安全 Java 调度
【并发编程】线程的基础知识篇
【并发编程】线程的基础知识篇
|
12月前
|
安全 Unix Linux
【Linux】线程基础知识
. 线程概念 线程(thread),是进程中的一条执行流,是被系统独立调度和分派的基本单位。一个标准的线程由线程ID、当前指令指针、寄存器集合和堆栈组成,此外一个线程可与同属一个进程组的其
|
缓存 安全 Java
线程基础知识总结
@[toc] 1. 认识线程(Thread) 1.1 概念 1.2 创建线程 1.2.1 方法1 继承Thread类 1.2.2 方法2 实现Runnable接口 1.2.3 实现 Callable 接口,使用 FutureTask 接收线程返回值 1.2.4 对比上面两种方法 2. Thread类及常见方法 2.1 Thread的常见构造方法 2.2 Thread的几个常见属性 2.3 启动一个线程-start() 2.4 中断一个线程 2.5 等待一个线程-join() 2.6 获取当前线程的引用 2.7 休眠当前线程 3. 线程的状态 3.1 线程的所有状态 3.2 线程各状态之间的转移
37 0
|
监控 安全 API
threading库:Python线程的基础知识
threading库:Python线程的基础知识
201 0
threading库:Python线程的基础知识
|
资源调度 Java 程序员
线程基础知识
计算机系统里每个进程(Process)都代表着一个运行着的程序,进程是对运行时程序的封装,系统进行资源调度和分配的基本单位。 一个进程下可以有很多个线程,线程是进程的子任务,是CPU调度和分派的基本单位,用于保证程序的实时性,实现进程内部的并发,线程同时也是操作系统可识别的最小执行和调度单位。 在 Java 里线程是程序执行的载体,我们写的代码就是由线程运行的。有的时候为了增加程序的执行效率,我们不得不使用多线程进行编程,虽然多线程能最大化程序利用 CPU 的效率,但也是程序事故多发、程序员脱发的最大诱因。主要是平时我们的思维默认是单线程的,写多线程的时候得可以切换一下才行。
|
存储 机器学习/深度学习 缓存
|
安全 Java 调度