zoukankan      html  css  js  c++  java
  • Java-Thread 线程

    一、进程与线程的概念

    进程和线程都是一个CPU工作时间段的描述,只是关注点不同。

    进程(Process):

    资源(CPU,内存等,文件,网络等)分配的基本单位。系统中有很多进程,它们都会使用内存。为了确保内存不被其他进程使用,每个进程所能访问的内存都是分配好的,不能互相干扰。

    线程(Thread):

    CPU 运行调度的基本单位。利用 CPU 去运行代码,线程必须被包含在进程中,一个进程可以有多个线程(至少有一个),这些线程有自己的资源(栈,寄存器等),其它线程可以读写这些栈内存。

    线程也有自己的局部存储(TLS)和当前指令指针(PC,标明下一指令执行点)。

    总结:

    进程像一个容器,里面有很多线程和资源,进程分配这些资源让线程去执行。线程之间通信很容易,进程之间通信(IPC)需要借助其他介质,如消息队列,管道等。同一进程内的线程间切换比进程间的切换要快。

    线程是一种轻量级的进程,是由进程派生出来的子任务,它是程序执行的一个路径。每个线程都有自己的局部变量表、程序计数器(指向真正执行的指令指针)以及各自的生命周期。

    https://docs.oracle.com/javase/tutorial/essential/concurrency/procthread.html

    二、并行与并发

    Parallel(Parallelism)并行:计算机能同时执行两个或多个任务

    Concurrent(Concurrency)并发:计算机能执行两个或多个任务,但不是同时,而是在任务间快速切换执行

    并发的重点在于有处理多个任务的能力,不一定要同时。而并行的重点在于就是有同时处理多个任务的能力。

    https://docs.oracle.com/javase/tutorial/essential/concurrency/index.html

    三、创建线程

    在 JAVA 中创建线程只有一种方式,那就是构造 Thread 类。

    而实现线程的执行单元则有两种方式,第一种是重写 Thread 类的 run 方法;第二种是实现 Runnable 接口的 run 方法,并且将 Runnable 实例用作构造 Thread 的参数。

    当启动了一个 JVM 时,从操作系统开始就会创建一个新的 JVM 进程,之后 JVM 进程中将会派生或者创建很多线程。

    https://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html

    new Thread(){
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName());
        }
    }.start();
    
    new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName());
        }
    }).start();

    四、Thread 的 start() 与 run()

    明确 “线程的执行单元” 与 “线程” 是两个不同的概念。在 JAVA 中通过 Thread 类重写的 run() 方法是线程的执行单元,而通过调用 start() 方法才是真正启动了一个线程。

    // start方法,核心部分是 start0() 这个 JNI 本地方法,开启了新的线程
    public synchronized void start() {
        if (threadStatus != 0)
            throw new IllegalThreadStateException();
        group.add(this);
        boolean started = false;
        try {
            start0();
            started = true;
        } finally {
            try {
                if (!started) {
                    group.threadStartFailed(this);
                }
            } catch (Throwable ignore) {}
        }
    }
    private native void start0();
    
    // run 方法,直接在当前线程执行,没有创建线程
    @Override
    public void run() {
        if (target != null) {
            target.run();
        }
    }

    https://mp.weixin.qq.com/s/MKhjg6JvOn4LM0j4rjj5cA

    https://hit-alibaba.github.io/interview/basic/arch/Concurrency.html

  • 相关阅读:
    [数据结构与算法]Note
    [C++]构造函数那些事
    [C++]constexpr函数
    [计算机系统]字/字节/位
    [C++]返回数组指针
    [C++]Top-level const/Low-level const
    [信号]预加重与去加重--转
    Smart solution of decode String
    ACE学习:
    模糊匹配算法
  • 原文地址:https://www.cnblogs.com/jhxxb/p/10813836.html
Copyright © 2011-2022 走看看