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

多线程基础-创建线程

线程的创建

线程的创建有三种方法

  1. 继承Thread类,并重写run方法
  2. 实现Runable接口,并实现run方法
  3. 实现Callabke接口,并实现call方法(此处不介绍)

案例:模拟文件下载
方法一:

public class ThreadTest1 extends Thread {private String fileName;// 构造方法,传入文件名public ThreadTest1(String fileName) {this.fileName = fileName;}@Overridepublic void run() {download(fileName);}// 模拟下载方法private void download(String file) {System.out.println(Thread.currentThread().getName() + " 开始下载:" + file);try {// 模拟下载耗时for (int i = 1; i <= 5; i++) {System.out.println(Thread.currentThread().getName() + " 正在下载 " + file + ",进度:" + (i * 20) + "%");Thread.sleep(500); // 模拟下载过程}} catch (InterruptedException e) {System.out.println("用户终止");}System.out.println(Thread.currentThread().getName() + " 下载完成:" + file);}// 主函数public static void main(String[] args) {ThreadTest1 t1 = new ThreadTest1("file1.zip");ThreadTest1 t2 = new ThreadTest1("file2.mp4");ThreadTest1 t3 = new ThreadTest1("file3.pdf");// 启动多个线程t1.start();t2.start();t3.start();}
}

方法二:

public class ThreadTest2 implements Runnable {private String fileName;public ThreadTest2(String fileName) {this.fileName = fileName;}@Overridepublic void run() {download(fileName);}private void download(String file) {System.out.println(Thread.currentThread().getName() + " 开始下载:" + file);try {for (int i = 1; i <= 5; i++) {System.out.println(Thread.currentThread().getName() + " 正在下载 " + file + ",进度:" + (i * 20) + "%");Thread.sleep(500);}} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + " 下载完成:" + file);}public static void main(String[] args) {// 创建 Runnable 实例ThreadTest2 task1 = new ThreadTest2("movie.mp4");ThreadTest2 task2 = new ThreadTest2("document.pdf");ThreadTest2 task3 = new ThreadTest2("game.zip");// 将任务交给 Thread 执行Thread t1 = new Thread(task1, "下载线程-1");Thread t2 = new Thread(task2, "下载线程-2");Thread t3 = new Thread(task3, "下载线程-3");// 启动线程t1.start();t2.start();t3.start();}
}

为什么推荐实现 Runnable 接口而不是继承 Thread?

两种方式的本质区别

方式 1:继承 Thread

class MyThread extends Thread {@Overridepublic void run() {System.out.println("线程运行中...");}
}
new MyThread().start();

Thread 是一个 类,它本身实现了 Runnable 接口;
当你继承它时,你其实是在继承整个线程类的实现;
这样做导致你的类已经“是一个线程对象”。

方式 2:实现 Runnable

class MyTask implements Runnable {@Overridepublic void run() {System.out.println("线程运行中...");}
}
new Thread(new MyTask()).start();

这里只定义了要执行的任务逻辑;
线程的启动、管理由 Thread 对象负责;
更加灵活、解耦。

总结: 我们希望各个模块、类的职能更清晰,实现功能的类只关注功能实现,而不必关心线程创建终止的逻辑

http://www.gsyq.cn/news/32951.html

相关文章:

  • 多功能名片小程序系统:助力企业与个人高效拓展人脉
  • 2025年上海直连全球云网络公司权威推荐榜单:AIGPU专用算力/GPU计费模式/GPU弹性算力源头厂家精选
  • IvorySQL 社区摆摊啦,GOTC 2025 开源集市等你来玩!
  • 2025年高速离心研磨抛光机厂家权威推荐榜单:环保研磨抛光机/钛合金研磨抛光机/不锈钢研磨抛光机源头厂家精选
  • 【System Beats!】第五章 优化程序性能
  • 2025年口碑好的密集母线槽产品
  • 2025 年凹槽铝方通,吊顶铝方通,铝方通格栅厂家最新推荐,产能、专利、环保三维数据透视
  • 2025年低压电缆品牌排行榜单
  • 2025年模压托盘品牌前十强权威评测:江苏同芯木业引领行业变革
  • PE文件
  • 2025年制冷设备厂家权威推荐榜单:冷库制冷设备/岗位送风设备/车间降温设备源头厂家精选
  • 2025年云南芒市旅游租车公司最新标杆服务商:腾冲佳旅汽车租赁,云南旅游包车|租车|汽车租赁|跨城出行新体验
  • 如何穿越进程边界就是一个startActivity请求
  • 2025冷弯型钢品牌 top 10 推荐
  • 【数据结构】堆、计数、桶、基数排序的实现 - 实践
  • 2025年光伏支架钢管品牌排行榜
  • Zotero说明
  • 今天的实习可以把新出的中小厂的岗位都投一遍
  • error 找不到模块“../views/Login.vue”或其相应的类型声明
  • java学习(自用)
  • 脑电数据PCA处理及SVM分类
  • 2025 年盐城异常处理,盐城行业资质,盐城财务代账,盐城会计代账公司最新推荐,聚焦资质、案例、售后的五家公司深度解读
  • 如何在Windows下开发输入法:Mini How to
  • 2025 年 10 月盐城公司变更,盐城地址挂靠,盐城商标注册公司最新推荐,聚焦资质、案例、售后的五家公司深度解读
  • 第一天学习
  • K3s + Sysbox:让容器拥有“虚拟机的灵魂”
  • 题解:AT_abc200_e [ABC200E] Patisserie ABC 2
  • CF1996G Penacony
  • 远程命令执行漏洞、SSRF、XXE、tomcat弱口令漏洞
  • Ollama API 交互