• Java并发编程——线程的基本概念和创建


    一、线程的基本概念:

    1、什么是进程、什么是是线程、多线程?

      进程:一个正在运行的程序(程序进入内存运行就变成了一个进程)。比如QQ程序就是一个进程。

      线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。。比如:QQ中的一个聊天框就是一个线程。

      多线程:一个程序中有多个线程同时运行就被称作多线程。

    2、单线程和多线程的区别:

      单线程的程序需要顺序执行,比如过安检,一个安检通道要排队每次只能过一个人,依次通过。

      多线程可以多个任务并发执行,比如多个安检通道,同一时间可以通过多个人。

    3、Java中线程的分类:

      用户线程:程序中我们自定义的线程。

      守护线程:守护线程--也称“服务线程”(不是由用户创建的线程),在没有用户线程可服务时会自动离开,这是优先级比较低的一类线程,相当于保姆,为系统中的其他对象和线程提供服务。比如:Java虚拟机的垃圾回收线程,当我们的程序中不再有任何运行中的Thread,程序就不会再产生垃圾,垃圾回收器也就无事可做,所以当垃圾回收线程是Java虚拟机上仅剩的线程时,Java虚拟机会自动离开。它始终在低级别的状态中运行,用于实时监控和管理系统中的可回收资源。它的生命周期依赖于系统。

    用户线程和守护线程的区别:

    JVM中所有的线程都是守护线程的时候,JVM就可以退出了;如果还有一个或以上的非守护线程则不会退出。(以上是针对正常退出,调用System.exit则必定会退出)  

    二、线程创建的两种方式:

    1、第一种:将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。

    //继承Thread类
    class PrimeThread extends Thread {
             long minPrime;
             PrimeThread(long minPrime) {
                 this.minPrime = minPrime;
             }
     
             public void run() {
                 // compute primes larger than minPrime
                  . . .
             }
         }
    
    //创建并启动线程
     PrimeThread p = new PrimeThread(143);
         p.start();

    2、第二种:声明实现 Runnable 接口的类。该类然后实现 run 方法。然后可以分配该类的实例,在创建 Thread 时作为一个参数来传递并启动

    //继承Runnable接口,重写run()方法
    class PrimeRun implements Runnable {
             long minPrime;
             PrimeRun(long minPrime) {
                 this.minPrime = minPrime;
             }
     
             public void run() {
                 // compute primes larger than minPrime
                  . . .
             }
         }
    
    //创建并启动一个线程
    PrimeRun p = new PrimeRun(143);
         new Thread(p).start();

    3、实现Runnable和继承Thread类的区别:

    (1)只有创建Thread对象才能创建线程,创建Runnable对象不能创建线程,只有把Runnable对象作为参数传递给Thread构造函数线程被创建。

    (2)实现Runnable接口,避免了继承Thread类的单继承局限性。

    (3)实现Runnable接口的方式,更加的符合面向对象,线程分为两部分,一部分线程对象,一部分线程任务;继承Thread类,线程对象和线程任务耦合在一起。一旦创建Thread类的子类对象,既是线程对象,有又有线程任务。实现runnable接口,将线程任务单独

    分离出来封装成对象,类型就是Runnable接口类型。Runnable接口对线程对象和线程任务进行解耦。

    4、thread.start()和runnable.run()的区别?

      thread.start():使该线程开始执行;Java 虚拟机调用该线程的 run 方法。

      runnable.run():普通方法的调用,不会启动线程。

  • 相关阅读:
    docker 可视化面板工具 protainer
    Docker 镜像及容器命令
    linux 系统上通过docker容器技术部署Nginx,whereis nginx
    Linux CentOS7 系统下安装及卸载Docker 及 配置阿里云镜像加速 及 Docker C/S架构
    Docker数据卷 Volume 挂载,容器路径与linux主机路径的一致性映射,mysql 实战
    什么是 JWT JSON WEB TOKEN ,理论部分
    2022 年最受瞩目的新特性 CSS @layer 到底是个啥?
    一道有意思的 CSS 面试题,FizzBu​​zz ~
    巧用 backgroundclip 实现超强的文字动效
    节点基于资源压力要驱逐pod时,pod的状态是什么?
  • 原文地址:https://www.cnblogs.com/zhoudaxing/p/11059099.html
Copyright © 2020-2023  润新知