Java线程的全方位详解

作者:吾日三省贾斯汀 时间:2023-04-11 14:02:55 

❤️‍大家好,我是贾斯汀,今天主要聊一聊关于线程的瓜!❤️‍

先来看一下线程这张图线程的几种运行状态之间运行流程:

Java线程的全方位详解

看不懂没关系,慢慢来学习,往下学习来继续了解一下~

什么是线程?

  • 线程是进程的一部分,是程序执行中的一条执行路线;

  • 进程就是指程序在其自身地址空间的一次执行活动,是程序独立运行的基本单位;

  • 一个进程可以包含多条线程,一个条线程对应一个进程中的一条执行路线。

Java线程的全方位详解

线程的几种创建方式?

主要由四种方式创建线程:

Java线程的全方位详解

  • 方式1:继承Thread类,重写run(),无返回值

  • 方式2:实现Runnable接口,重写run(),无返回值

  • 方式3:新建FutureTask + 实现Callable接口,重写call(),有返回值

  • 方式4:通过Executors工具类创建线程池 + 调用submit + 重写Callable接口,重写call(),有返回值

具体每一种创建方式说明及代码实现如下:


/**
* 创建Thread线程的四种方式之内部类写法
*/
public class NewThread {

public static void main(String[] args) throws Exception {

//方式1
       Thread t1 = new Thread(){
           @Override
           public void run() {
               System.out.println("方式1:继承Thread类并重写run()方法创建线程,无返回值");
           }
       };
       t1.start();
       Thread.sleep(1000);

//方式2
       Thread t2 = new Thread(new Runnable() {
           @Override
           public void run() {
               System.out.println("方式2:实现Runnable接口并重写run()方法创建线程,无返回值");
           }
       });
       t2.start();
       Thread.sleep(1000);

//方式3
       FutureTask<String> ft = new FutureTask<>(new Callable<String>() {
           @Override
           public String call() throws Exception {
               String result = "方式3:实现Callable接口并重写call()方法新建FutureTask对象作为new Thread实例化参数创建线程,有返回值";
               return result;
           }
       });
       Thread t3 = new Thread(ft);
       t3.start();
       System.out.println(ft.get()); //输出返回值

Thread.sleep(1000);

//方式4
       ExecutorService pool = Executors.newFixedThreadPool(5);
       Future<String> future = pool.submit(new Callable<String>(){
           @Override
           public String call() throws Exception {
               String result = "方式4:通过工具类Executors创建线程池,调用submit新建Future对象并重写Callable接口重写call()方法创建线程,有返回值";
               return result;
           }
       });
       pool.shutdown();//关闭线程池
       System.out.println(future.get()); //输出返回值
   }
}

线程的几种状态?

  • 新建(new):通过上面介绍的某种方式新建线程即处于新建状态;

  • 就绪(Ready):调用线程的start()方法,首先进入就绪状态,等待获取CPU时间;

  • 运行(Running):就绪状态的线程获取到CPU时间或阻塞状态的线程恢复都可进入运行状态;

  • 阻塞(Blocked):运行状态的线程可能因为IO阻塞或在synchronized同步代码块中都可进入阻塞状态;

  • 死亡(Dead):正常运行的线程执行结束或就绪状态的线程直接调用stop()方法就会进入死亡状态;

  • 睡眠(Sleeping):调用sleep方法指定线程睡眠多久,会释放CPU资源,但不释放锁资源,睡眠时间到后会重新进入就绪状态;

  • 等待(Waiting):调用wait会让线程短暂的处于等待中,会释放CPU资源,并且释放锁资源,进入就绪状态。

Java线程的全方位详解

线程相关的核心方法及作用?

  • start:调用start()方法底层源码会判断线程状态是否是新建状态,不是则直接抛异常,并且后续会调用一个native本地方法start0,其底层通过JVM来进行调度最后调用run()方法执行;

  • run:调用run()方法,底层会直接进入到重写的run()方法并执行代码块内容;

  • sleep:属于Thread类的一个native本地static静态方法,可以在任何地方调用sleep(1000)方法,期间会让当前线程进入睡眠状态1秒钟,并让出CPU资源,但不释放锁资源

  • wait:属于Object类的一个方法,只能在synchronized同步块中进行调用wait(1000)方法,期间会让当前线程进入等待状态1秒钟,不仅会让出CPU时间,还释放并释放对象锁资源

  • yield:跟sleep一样,也是Thread类的一个native本地static静态方法,与sleep的最大区别在于Thread.yield()不需要指定暂停时间,并不会阻塞线程,而是进入就绪状态,短暂的让出CPU资源,这份CPU资源可能自己会再次获取到,这个取决于调度器;

  • notify:同wait一样,也是属于Object类的一个方法,作用是可以将wait()后等待的线程进行单个唤醒,并进入Read就绪状态;

  • notifyAll:同notify一样,也是属于Object类的一个方法,作用将当前对象上的所有等待线程唤醒,并进入Read就绪状态;

  • stop:该方法已被废弃,不建议使用,该方法的作用是直接将线程结束,进入死亡状态;

  • interrupt:冲断线程,不保证线程进入死亡、就绪还是继续运行,不想stop可以直接冲断一个正在运行的线程。 What's up!不来个点赞支持一下,这手指是金子做的?

来源:https://blog.csdn.net/qq_33414271/article/details/78522235

标签:Java,线程,Thread
0
投稿

猜你喜欢

  • springAop实现权限管理数据校验操作日志的场景分析

    2023-11-23 10:00:27
  • C# 利用Selenium实现浏览器自动化操作的示例代码

    2023-08-10 23:43:15
  • Android AndBase框架使用封装好的函数完成Http请求(三)

    2021-09-15 09:49:56
  • IntelliJ IDEA 下载安装超详细教程(推荐)

    2023-11-19 23:50:16
  • android高仿小米时钟(使用Camera和Matrix实现3D效果)

    2022-05-15 01:46:18
  • 详解Java Selenium中的鼠标控制操作

    2023-11-23 14:43:17
  • SpringBoot Web依赖教程

    2023-01-06 21:51:50
  • Java持久化XML文件配置解析

    2022-06-27 13:45:07
  • Android 根据手势顶部View自动展示与隐藏效果

    2022-01-11 07:30:20
  • C#语音识别用法实例

    2021-09-11 01:16:47
  • Spring main方法中如何调用Dao层和Service层的方法

    2023-11-28 23:15:19
  • Android SharedPreferences的使用分析

    2023-11-09 18:47:08
  • Java详细讲解堆排序与时间复杂度的概念

    2023-10-20 02:00:11
  • WPF实现背景灯光随鼠标闪动效果

    2023-09-05 15:39:27
  • Java 实现FTP服务实例详解

    2023-06-18 10:45:25
  • 一文带你学会规则引擎Drools的应用

    2022-04-03 08:40:59
  • Java利用Strategy模式实现堆排序

    2022-07-16 08:01:04
  • java8中的默认垃圾回收器(GC)

    2021-12-01 04:27:30
  • C#绘制时钟的方法

    2021-08-25 15:18:12
  • Java编程用指定字符打印菱形实例

    2022-02-23 05:49:09
  • asp之家 软件编程 m.aspxhome.com