0
点赞
收藏
分享

微信扫一扫

JUC:1_基础知识:进程和线程的区别、Java有几个线程、Java是否真的可以开启线程、并发和并行、Java线程状态、wait和sleep区别

JUC:1_基础知识:进程和线程的区别、Java有几个线程、Java是否真的可以开启线程、并发和并行、Java线程状态、wait和sleep区别

Runable

Runable:没有返回值,效率比Callable低,功能也没有Callable强大,没有Callable常用。

进程和线程的区别

进程是操作系统中的应用程序,是资源分配的基本单位。线程是用来执行具体的任务和功能,是CPU调度和分派的基本单位。

通俗的讲

  • 进程是应用程序,是OS(操作系统)调度单位
  • 线程是CPU最小调度单位
  • 每个应用程序中有多个任务,线程就是任务,即每个进程中包含一个或多个线程

在这里插入图片描述

请添加图片描述

以office word为例,它可以写字、会上传云端、会自动保存,这些就是不同的线程去负责的,而你启动word,就是启动了一个进程。

Java中的线程需要弄明白的

Java有几个线程?

2个,mian线程和GC线程
对于Java而言,使用线程就是Thread、Runable、Callable

Java是否真的可以开启线程?

当然是开不了的

  • Java启动线程是通过xxx.start()去启动
  • 这个start()是synchronized修饰的同步方法,线程安全
  • start()里面做了什么?
    • 1.把当前线程加入线程组group
    • 2.用startted来记录线程启动状态,初始化为flase
    • 3.调用本地方法native start0()去启动线程并更把线程启动状态改为true
  • Java是运行在JVM虚拟机上的,Java本身无法操作底层硬件,start0()底层是调用c++

具体可以去查看线程启动的源码,从start进去。

可以看到start()是synchronized方法,是线程安全的方法。

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".:零状态值对应于状态"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);//private ThreadGroup group;把线程加入到线程组里

        boolean started = false;//线程是否启动的标志:false-->true
        try {
            start0();//private native void start0(),native 修饰的,因此可以知道start0()是一个本地方法,底层是调用c++
            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();

并发和并行

**并发:**一个核心处理多个任务,一时刻,多线程交替执行,CPU单核只有并发、没有并行
**并行:**多个核心处理多个任务,一时刻,多线程同时执行,CPU线程核心数=最大并行执行数,所以你的线程池配置多少和CPU核心数有很大关系

在这里插入图片描述

**并发编程的本质:**充分利用CPU资源

Java线程状态:Thread.State

线程状态,线程可以处于以下状态之一:

  • NEW:尚未启动的线程处于此状态
  • RUNNABLE:再Java虚拟机中执行的线程处于此状态
  • BLOCKER:被阻塞等待监视器锁定的线程处于此状态
  • WAITING:正在等待另一个线程执行特定动作的线程处于此状态
  • TIMED_WAITING:正在等待另一个线程执行特定动作到达指定时间的线程处于此状态
  • TERMINATED:已退出的线程处于此状态

一个线程可以再给定时间点处于一个状态,这些状态是不反应任何操作系统线程状态的虚拟机状态。

请添加图片描述

线程中断或者结束,一旦进入TERMINATED
终止状态,就不能再次启动

wait和sleep区别

来自不同的类

wait–>Object
sleep–>Thread

关于锁的释放

wait会释放锁
sleep不会释放锁,抱着锁睡觉

适用范围不同

wait必须在同步代码块或同步方法里
sleep可以在任何地方使用

是否需要捕获异常

wait不需要捕获异常
sleep需要捕获异常,因为肯能发生超时等待的问题

举报

相关推荐

0 条评论