当前位置: 首页 > news >正文

多线程基础(2)

1.创建线程的多种方式:

方法一:继承Thread来创建一个类

class MyThread extends Thread{ @override public void run(){ System.out.println("打个比方") } } public class Demo1{ public static void main(String[] args){ Mythread t=new MyThread(); t.start(); } }

方法二:实现Runnable接口

class MyRunnable inplement Runnable{ @override publicn void run(){ System.out.println("打个比方"); } } public class Demo2{ public static void main(String[] args){ Thread t=new Thread(new MyRunnable()); t.start(); } }

方法三:匿名内部类创建thread子类对象

Thread t=new Thread(){ @override public void run(){ System.out.println("举个例子")}; };

方法四:匿名内部类创建Runnable子类对象

Thread t2 = new Thread(new Runnable() { @Override public void run() { System.out.println("使用匿名类创建 Runnable 子类对象"); } });

方法五:lambda表达式创建Runnable子类对象

Thread t3 = new Thread(() -> System.out.println("使用匿名类创建 Thread 子类对象")); Thread t4 = new Thread(() -> { System.out.println("使用匿名类创建 Thread 子类对象"); });

2.多线程的优势-提升运行速度

通过并发执行和单独执行进行比较

public class demo1 { private static final long count = 1000000000; public static void main(String[] args) throws InterruptedException { Thrm1(); Thrm2(); } private static void Thrm1() throws InterruptedException { long begin=System.nanoTime(); Thread thread=new Thread(() ->{ int a=0; for (int i = 0; i <count; i++) { a--; } }); thread.start(); int b=0; for (int i = 0; i < count; i++) { b--; } thread.join(); long end =System.nanoTime(); double time=(end-begin)*1.0/1000/1000; System.out.printf("%f %n",time); } private static void Thrm2() { long begin=System.nanoTime(); int a=0; for (int i = 0; i <count; i++) { a--; } int b=0; for (int i = 0; i < count; i++) { b--; } long end =System.nanoTime(); double time=(end-begin)*1.0/1000/1000; System.out.printf("%f %n",time); } }
并发: 399.651856 毫秒 串行: 720.616911 毫秒

3.Thread类的常用方法

用lambda举个例子:

public class ThreadLambdaExample { public static void main(String[] args) { // 1. 无参构造,空任务 Thread t1 = new Thread(() -> {}); // 2. 传入Runnable任务 Thread t2 = new Thread(() -> { System.out.println("线程t2执行中..."); }); // 3. 指定线程名,空任务 Thread t3 = new Thread(() -> {}, "这是我的名字"); // 4. 传入Runnable任务并指定线程名 Thread t4 = new Thread(() -> { System.out.println("线程t4执行中..."); }, "这是我的名字"); // 启动线程 t2.start(); t4.start(); } }

3.Thread的几个常见属性

属性获取方法
idgetId()
名称getName()
状态优先级getState()
是否为后台线程getPriority()
是否存活isAlive()
是否被中断isInterrupted()
  • ID 是线程的唯一标识,不同线程不会重复
  • 名称是各种调试工具用到
  • 状态表示线程当前所处的一个情况,下面我们会进一步说明
  • 优先级高的线程理论上来说更容易被调度到
  • 关于后台线程,需要记住一点:JVM会在一个进程的所有非后台线程结束后,才会结束运行。
  • 是否存活,即简单的理解,为 run 方法是否运行结束了
  • 线程的中断问题,下面我们进一步说明
public class demo2 { public static void main(String[] args) { Thread thread=new Thread(() -> { try { System.out.println(Thread.currentThread().getName()+"我还活着"); Thread.sleep(100); } catch (InterruptedException e) { throw new RuntimeException(e); } System.out.println(Thread.currentThread().getName()+"我马上死,兄弟!"); }); System.out.println(Thread.currentThread().getName()+"ID:"+thread.getId()); System.out.println(Thread.currentThread().getName()+"名字:"+thread.getName()); System.out.println(Thread.currentThread().getName()+"状态:"+thread.getState()); System.out.println(Thread.currentThread().getName()+"优先级:"+thread.getPriority()); System.out.println(Thread.currentThread().getName()+"后台线程:"+thread.isDaemon()); System.out.println(Thread.currentThread().getName()+"活着:"+thread.isAlive()); System.out.println(Thread.currentThread().getName()+"被中断:"+thread.isInterrupted()); thread.start(); while(thread.isAlive()){ System.out.println(Thread.currentThread().getName()+"状态:"+thread.getState()); } } }
http://www.jsqmd.com/news/449564/

相关文章:

  • Leetcode使用最小花费爬楼梯的解法思考与回溯
  • 不踩雷!千笔ai写作,普遍认可的AI论文工具
  • 土豆矮砧密植:水肥一体化系统铺设全指南
  • DeepInnovator专攻一件事:让LLM自己想出科研新点子
  • 信息奥赛一本通—编程启蒙(3366:【例63.2】 回形方阵)
  • Uniapp微信小程序:自定义海报生成方案。支持保存到本地,二维码生成,富文本解析(个人学习记录)
  • Legal RAG Bench:当检索拖了后腿,大模型再聪明也白搭
  • Qwen-Image-2512-SDNQ Web服务部署教程:防火墙端口开放与公网访问安全配置
  • 虚拟机常见问题
  • Janus-Pro-7B企业实操:客服中心图片工单理解+标准化回复生成
  • 9K 条数据训 4B 模型,逼近 DeepSeek-R1?CHIMERA 用合成数据破解推理冷启动难题
  • 学长亲荐!千笔AI,研究生论文写作神器
  • 安晋捷运(深圳)国际物流有限公司安井株式会社日本专线物流服务
  • prometheus告警-以CPU使用率告警为例
  • 查重35%、AI概率80%?别删内容!百考通用语义重构双降达标
  • 独立开发者出海收款指南:用 Wise 打通 App Store 海外收入
  • 【LLM】Labor market impacts of AI
  • 小爱AIAPI连接方法python
  • Windows 11 安装AIRI踩坑指北
  • Spring_couplet_generation 结合MySQL存储用户生成记录:安装配置与集成实战
  • 研发电脑防止拍照 公司防拍照泄密的Top5实用防护方案
  • 深度拆解:零门店无代理的半年6000万营收策略
  • 科技越发达,内心的平静反而越珍贵
  • OpenClaw:通过飞书发送文件的完整教程
  • ## RV1126B MIPI 接口适配 SC233HGS 控制列表调试
  • OpenClaw安装配置
  • 【四旋翼】基于反步控制和滑模控制SMC实现四旋翼在存在风扰动态环境中的稳定性,一种针对四旋翼无人机的抗干扰非线性控制策略实现附matlab代码
  • 【2025最新】基于SpringBoot+Vue的饮食分享平台管理系统源码+MyBatis+MySQL
  • 贡献法+容斥原理,abc248G - GCD cost on the tree
  • 亲测分享权威geo渠道实践经验