Java之线程:线程的创建、实现、方法及现成的状态

线程基础

  1. 程序、进程、线程?
  • 程序:

    ​ 程序是含有指令和代码的文件,被存储在磁盘或其他数据存储设备中,可以理解为程序是包含静态代码的文件。例如,浏览器软件,游戏软件等软件的安装目录和文件

  • 进程:

    ​ 进程是程序的一次执行过程,是系统运行程序的基本单位,并分配CPU、网络、磁盘、内存等资源

  • 线程:

    ​ 线程是进程划分成的更小的运行单位。进程和线程的关系:一个进程可以包含一个或多个线程,但至少会有一个主线程。

线程的创建

创建Thread对象

Thread thread = new Thread();	

线程的实现

  1. 实现Runnable接口

    Thread thread = new Thread(new Runnable() {@Overridepublic void run() {for(char c = 'a' ; c<='z' ; c++) {System.out.println(Thread.currentThread().getName() + " :" +c);}}
    },"子线程1");
    thread.start();   // 启动子线程,自动执行Runnable接口的实现类对象的run()
    
  2. 继承Thread类

    Thread thread2 = new Thread("子线程2") {@Overridepublic void run() {for(int i =1 ; i<=26 ; i++) {System.out.println(Thread.currentThread().getName() + " :" + i);}}
    };
    // 启动子线程
    thread2.start();
    
  3. 实现Callable接口(子程序执行后有返回值)

    泛型:返回值类型

    public static void main(String[] args) throws InterruptedException, ExecutionException {// 多线程实现1-10000相加SubTask subTask1 = new SubTask();FutureTask<Integer> futureTask1 = new FutureTask<Integer>(subTask1);// 创建线程对象Thread thread1 = new Thread(futureTask1);// 启动子线程thread1.start();// 当所有的子线程执行结束后,通过get方法获取返回值Integer sum1 = futureTask1.get();System.out.println(sum1);
    }class SubTask implements Callable<Integer> {@Overridepublic Integer call() throws Exception {int sum = 0;// xxxreturn sum;}
    }
    
  4. 线程池(提高线程的使用效率)

    ExecutorService:Java中的一个接口,它提供了一种管理和执行线程的机制;

    Executors:工具类,用于创建各种形式(类型)的线程池

    Executors.newFixedThreadPool(n):创建n个线程数目的线程池

    // 通过工具类创建5个线程的线程池
    ExecutorService executorService = Executors.newFixedThreadPool(5);// 创建动态数目(数目不固定)的线程池
    ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
    

    线程池相关的方法:

    1. 线程池分配一个空闲线程执行任务的方法:submit();

    2. 关闭线程池的方法:shutdown();

线程的方法

  1. 获取当前JVM中的线程

    public static void main(String[] args) {// 获取当前JVM中的进程ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false);for(ThreadInfo threadInfo :threadInfos) {System.out.println("【"+threadInfo.getThreadId() +"】:"+ threadInfo.getThreadName());}
    }
    
  2. 获取当前线程:Thread.currentThread()

    Thread.currentThread();
    
  3. 线程命名

    Thread thread = new Thread(new Runnable{@Overridepublic void run() {xxx}
    },"xxx1");   // 给thread线程命名为xxx1Thread thread2 = new Thread("xxx2"){    // 给thread线程命名为xxx2@Overridepublic void run() {xxx}
    }Thread thread3 = new Thread();
    thread3.setName("xxx3");   // 给thread3线程命名为xxx3
    
  4. 线程休眠:Thread.Sleep();

    Thread.Sleep(1000);   // 设置线程休眠1000毫秒  
    
  5. 设置线程优先级

    Thread对象.setPriority();优先级最高为10,最低为1,默认值为5

    Thread thread1 = new Thread();
    Thread thread2 = new Thread();thread1.setPriority(1);
    thread2.setPriority(10);
    

    优先级只是起参考作用,设置高优先级不一定先完成任务

  6. 线程的插队

    Thread对象.join();

    join()方法通过wait()实现,是被插队的线程(主线程),处于等待状态。

    public class thread05 {public static void main(String[] args) MyTask myTask = new MyTask();Thread thread = new Thread(myTask,"子线程1");thread.start();// 子线程的插队// 主线程不会等待子线程执行完毕再向下执行,主线程等待子线程执行完毕需要子线程插队try {thread.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("main线程执行完毕!");
    }class MyTask implements Runnable{@Overridepublic void run() {char c = '一';for(int i = 0;i<26; i++,c ++ ) {try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+c);}}
    }
    
  7. 线程的中断

    Thread对象.interrupt():设置当前线程为中断状态;

    线程中断时,会抛出InterruptedException异常;

    Thread对象.isInterrupted():判断当前线程是否为中断状态,返回值为Boolean类型

    Thread thread = new Thread();
    System.out.println(thread.isInterrupted());   // true  OR false
    
  8. 线程的让出

    线程调度模型:

    1. 分时调度模型:所有线程轮流获取CPU使用权,平均分配每个线程占用的CPU时间片
    2. 抢占调度模型:优先分配给优先级较高的线程占用CPU,如果优先级相同,则随机选择一个线程;JVM虚拟机采用抢占调度模型;
    Thread.yield();
    
  9. 线程的分类

    1. 用户线程:所有用户线程执行结束后,JVM虚拟机会自动退出;

    2. 守护线程:守护线程执行结束后,JVM虚拟机不会自动退出;

      Thread对象.setDaemon(true);

    Thread thread = new Thread();
    thread.setDaemon(true);
    

线程的状态

NEW、RUNNABLE、BLOCKED、WAITING、TIME_WAITING、TERMINATED

在这里插入图片描述

  1. NEW:新建状态

    调用构造方法后,线程处于新建状态;

  2. RUNNABLE:可运行状态

    调用线程的start()方法后,线程处于可运行状态;

  3. BLOCKED:阻塞状态

    两个线程同时竞争synchronized锁时,获取锁的线程处于RUNNABLE运行状态,未获取锁的线程处于BLOCKED阻塞状态;

  4. WAITING:等待状态

    必须通过notify()或notifyAll()唤醒

  5. TIME_WAITING:计时等待状态

    等待计时结束时,自动唤醒

  6. TERMINTED:终止状态

    线程任务执行完毕

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/484134.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL注入漏洞解析

什么是SQL注入 原理&#xff1a; SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严&#xff0c;攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句&#xff0c;在管理员不知情的情况下实现非法操作&#xff0c;以此来实现欺骗数据库服…

在vue3中使用canvas实现雨滴效果

在vue3中使用canvas实现雨滴效果 这是封装的一个组件DotAndRain&#xff08; &#xff09; <script setup> import { ref, onMounted } from "vue"; import { onUnmounted } from "vue";let animationFrameId null;const el ref(null); let canv…

⭐北邮复试刷题LCR 052. 递增顺序搜索树__DFS (力扣119经典题变种挑战)

LCR 052. 递增顺序搜索树 给你一棵二叉搜索树&#xff0c;请 按中序遍历 将其重新排列为一棵递增顺序搜索树&#xff0c;使树中最左边的节点成为树的根节点&#xff0c;并且每个节点没有左子节点&#xff0c;只有一个右子节点。 示例 1&#xff1a; 输入&#xff1a;root [5,…

论文学习 BioNeRF: Biologically Plausible Neural Radiance Fields for View Synthesis

论文学习 BioNeRF: Biologically Plausible Neural Radiance Fields for View Synthesis 前言简介NeRF介绍BioNeRF位置编码提取感知过滤记忆更新纹理推断损失函数 量化验证总结 前言 虽然我不应该再看NeRF相关的东西了&#xff0c;但是我还是觉得这个论文的题目很有意思&#…

一文穿透线程池,从此吊打面试官

目录 一、什么是线程池&#xff1f; 为什么要使用它&#xff1f; 二、什么是Executor框架&#xff1f; 三、什么是阻塞队列&#xff1f;如何使用阻塞队列来实现生产者-消费者模型&#xff1f; 四、常见线程池的快捷创建方式 五、为什么不建议使用 Executors静态工厂构建线…

六、回归与聚类算法 - 欠拟合和过拟合

目录 1、定义 2、原因及解决方法 2.1 正则化 线性回归欠拟合与过拟合线性回归的改进 - 岭回归分类算法&#xff1a;逻辑回归模型保存与加载无监督学习&#xff1a;K-means算法 1、定义 2、原因及解决方法 2.1 正则化

windows极限摸鱼软件(仅6678kb)

时间过得真快啊&#xff0c;不知不觉春节假期就过完了。你已经开始工作了吗&#xff1f;反正我是一直没闲着。 歇的时间久了&#xff0c;一上班这节奏很难一下子转换过来。也可能刚上班&#xff0c;没什么事情做&#xff0c;有点无聊。 &#xff08;好吧&#xff0c;我承认了…

外卖柜平台的设计与实现以及实践与总结

近年来&#xff0c;外卖行业的快速发展推动了外卖配送行业的进步和创新。外卖柜平台作为一种新兴的配送方式&#xff0c;在提高配送效率和服务质量方面具有很大的优势。本文将探讨美团外卖柜平台的设计与实现&#xff0c;以及如何保障其稳定性和安全性。 架构设计 美团外柜平台…

2024最佳住宅代理IP服务商

跨境出海已成为了近几年的最热趋势&#xff0c;大批量的企业开始开拓海外市场&#xff0c;而海外电商领域则是最受欢迎的切入口。新兴的tiktok、Temu&#xff0c;老牌的Amazon、Ebay&#xff0c;热门的Etsy、Mecari等等都是蓝海一片。跨境入门并不难&#xff0c;前期的准备中不…

【鸿蒙 HarmonyOS 4.0】TypeScript开发语言

一、背景 HarmonyOS 应用的主要开发语言是 ArkTS&#xff0c;它由 TypeScript&#xff08;简称TS&#xff09;扩展而来&#xff0c;在继承TypeScript语法的基础上进行了一系列优化&#xff0c;使开发者能够以更简洁、更自然的方式开发应用。值得注意的是&#xff0c;TypeScrip…

2/22作业

1.按位置插入 void insert_pos(seq_p L,datetype value,int pos) { if(LNULL) { printf("入参为空\n"); return; } if(seq_full(L)) { printf("表已满\n"); return; } if(pos>L->len|…

MATLAB 导出可编辑的eps格式图像

任务描述&#xff1a;部分期刊要求提交可编辑的eps格式图像&#xff0c;方便美工编辑对图像进行美化 我试了直接print或者在figure窗口导出&#xff0c;发现导出的文件放到Adobe AI中并不能编辑&#xff0c;经Google找到解决办法&#xff1a; %EPS exportgraphics(gcf,myVect…