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

线程实现的几种方式

1、继承Thread类

import java.util.*;public class Test {/*** 打字员线程,每秒打出多少字*/class Typist extends Thread {@Overridepublic void run() {int wordNum = new Random().nextInt(5);for(int i=1;i<=5;i++) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(this.getName() + "在第" + i + "秒打了" + wordNum + "个字");}}}public void printStart() {Thread typist1 = new Typist();typist1.setName("打字员A");Thread typist2 = new Typist();typist2.setName("打字员B");Thread typist3 = new Typist();typist3.setName("打字员C");typist1.start();typist2.start();typist3.start();}public static void main(String[] args) {/*** 主线程结束* 打字员A在第1秒打了4个字* 打字员B在第1秒打了2个字* 打字员C在第1秒打了4个字* 打字员C在第2秒打了4个字* 打字员B在第2秒打了2个字* 打字员A在第2秒打了4个字* 打字员A在第3秒打了4个字* 打字员C在第3秒打了4个字* 打字员B在第3秒打了2个字* 打字员A在第4秒打了4个字* 打字员B在第4秒打了2个字* 打字员C在第4秒打了4个字* 打字员B在第5秒打了2个字* 打字员C在第5秒打了4个字* 打字员A在第5秒打了4个字*/new Test().printStart();System.out.println("主线程结束");}
}

2、实现Runnable接口(推荐方式)

import java.util.*;public class Test {/*** 打字员线程,每秒打出多少字*/class Typist implements Runnable {@Overridepublic void run() {int wordNum = new Random().nextInt(5);for(int i=1;i<=5;i++) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "在第" + i + "秒打了" + wordNum + "个字");}}}public void printStart() {Typist typist1 = new Typist();Thread t1 = new Thread(typist1);Typist typist2 = new Typist();Thread t2 = new Thread(typist2);Typist typist3 = new Typist();Thread t3 = new Thread(typist3);t1.setName("打字员A");t2.setName("打字员B");t3.setName("打字员C");t1.start();t2.start();t3.start();}public static void main(String[] args) {new Test().printStart();System.out.println("主线程结束");}
}

3、实现Callable接口,可以从线程中获取返回值


import lombok.Data;import java.util.*;
import java.util.concurrent.*;public class Test {/*** 打字员线程,每秒打出多少字*/@Dataclass Typist implements Callable<Integer> {private String name;@Overridepublic Integer call() throws Exception {int wordCount = 0;int wordNum = new Random().nextInt(5);for(int i=1;i<=5;i++) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}wordCount += wordNum;System.out.println(this.getName() + "在第" + i + "秒打了" + wordNum + "个字");}return wordCount;}}public void printStart() throws ExecutionException, InterruptedException {Typist t1 = new Typist();t1.setName("打字员A");FutureTask<Integer> futureTask1 = new FutureTask<>(t1);Thread thread1 = new Thread(futureTask1);thread1.start();Typist t2= new Typist();t2.setName("打字员B");FutureTask<Integer> futureTask2 = new FutureTask<>(t2);Thread thread2 = new Thread(futureTask2);thread2.start();System.out.println(t1.getName() + "一共打了" + futureTask1.get() + "个字");//get()方法阻塞System.out.println(t2.getName() + "一共打了" + futureTask2.get() + "个字");}public static void main(String[] args) throws ExecutionException, InterruptedException {new Test().printStart();System.out.println("主线程任务结束");}
}

FutureTask.get()方法阻塞,程序的运行后,最后打印【主线程任务结束】

4、Callable接口+线程池(推荐方式,可以从线程中获取返回值)


import lombok.Data;import java.util.*;
import java.util.concurrent.*;public class Test {/*** 打字员线程,每秒打出多少字*/@Dataclass Typist implements Callable<Integer> {private String name;@Overridepublic Integer call() throws Exception {int wordCount = 0;int wordNum = new Random().nextInt(5);for(int i=1;i<=5;i++) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}wordCount += wordNum;System.out.println(this.getName() + "在第" + i + "秒打了" + wordNum + "个字");}return wordCount;}}public void printStart() throws ExecutionException, InterruptedException {//固定大小线程池ExecutorService executorService = Executors.newFixedThreadPool(3);Typist t1 = new Typist();t1.setName("打字员A");Typist t2 = new Typist();t2.setName("打字员B");Typist t3 = new Typist();t3.setName("打字员C");Future<Integer> f1 = executorService.submit(t1);//非阻塞Future<Integer> f2 = executorService.submit(t2);Future<Integer> f3 = executorService.submit(t3);executorService.shutdown();System.out.println(t1.getName() + "一共打了" + f1.get() + "个字") ;//阻塞System.out.println(t2.getName() + "一共打了" + f2.get() + "个字") ;System.out.println(t3.getName() + "一共打了" + f3.get() + "个字") ;}public static void main(String[] args) throws ExecutionException, InterruptedException {new Test().printStart();System.out.println("主线程任务结束");}
}

Future.get()方法阻塞等待t1线程结束,获取线程执行完成后的返回值

应用场景:这种方式适合大数据量计算时,开启多个线程分别执行部分数据,最后通过get()方法的返回值再合并各个线程计算结果,经典的map-reduce

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Android SystemUI组件(06)导航栏创建分析虚拟按键
  • 在Linux中从视频流截取图片帧(ffmpeg )
  • 去除恢复出厂设置中UI文字显示
  • 3.无人机介绍
  • 《人工智能安全治理框架》1.0版
  • 【算法】模拟退火
  • [linux 驱动]i2c总线设备驱动详解与实战
  • 揭开Facebook AI的神秘面纱:如何利用人工智能提升社交体验
  • C++ | Leetcode C++题解之第395题至少有K个重复字符的最长子串
  • 还能买燃油车吗
  • Pygame中Sprite类实现多帧动画3-1
  • 一个例子彻底搞懂对线程模型的理解 !
  • 【Puppeteer】‘left‘ is already pressed, ‘${button}‘ is already pressed 的解决办法
  • Qt常用控件——QRadioButton和QCheckBox
  • 【VSCode v1.93.0】手动配置远程remote-ssh
  • ----------
  • 《剑指offer》分解让复杂问题更简单
  • Angularjs之国际化
  • CentOS7 安装JDK
  • javascript从右向左截取指定位数字符的3种方法
  • JS 面试题总结
  • Laravel 实践之路: 数据库迁移与数据填充
  • orm2 中文文档 3.1 模型属性
  • php面试题 汇集2
  • SpiderData 2019年2月23日 DApp数据排行榜
  • swift基础之_对象 实例方法 对象方法。
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 数据结构java版之冒泡排序及优化
  • 微信小程序:实现悬浮返回和分享按钮
  • 小程序开发之路(一)
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 做一名精致的JavaScripter 01:JavaScript简介
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​MySQL主从复制一致性检测
  • ​TypeScript都不会用,也敢说会前端?
  • ​力扣解法汇总946-验证栈序列
  • "无招胜有招"nbsp;史上最全的互…
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (0)Nginx 功能特性
  • (2)STL算法之元素计数
  • (翻译)terry crowley: 写给程序员
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • *上位机的定义
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • @AliasFor注解
  • @PreAuthorize与@Secured注解的区别是什么?
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决
  • [ 数据结构 - C++] AVL树原理及实现
  • [ 网络基础篇 ] MAP 迈普交换机常用命令详解