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

Java多线程实现:Thread、Runnable与Callable详解

多线程的实现方式:

继承Thread类的方式进行实现

  1. 继承Thread类
    通过继承Thread类并重写run()方法来实现多线程。创建子类实例后,调用start()方法启动线程。

public class Test3 {public static void main(String[] args) throws IOException {Friend f1=new Friend();Friend f2=new Friend();f1.setName("线程1");f2.setName("线程2");//开启线程f1.start();//开启第二个线程f2.start();}}
public class Friend extends Thread{@Overridepublic void run() {//书写线程要执行的代码for (int i = 0; i < 100; i++) {System.out.println(getName()+"hello");}}
}

2.实现Runnable接口

通过实现Runnable接口并实现run()方法来实现多线程。将实现类实例作为参数传递给Thread对象,然后调用start()方法启动线程。

// 实现Runnable接口
class MyRunnable implements Runnable {@Overridepublic void run() {// 线程执行的任务for (int i = 0; i < 5; i++) {System.out.println(Thread.currentThread().getName() + " - " + i);}}
}public class Main {public static void main(String[] args) {// 创建Runnable实现类的实例MyRunnable myRunnable = new MyRunnable();// 将Runnable实例作为参数传递给Thread对象Thread thread = new Thread(myRunnable);// 启动线程thread.start();// 主线程继续执行其他任务for (int i = 0; i < 5; i++) {System.out.println(Thread.currentThread().getName() + " - " + i);}}
}

3.实现Callable接口

通过实现Callable接口并实现call()方法来实现多线程。与Runnable不同,Callable可以返回执行结果并抛出异常。通常与FutureTask或线程池结合使用。

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;public class CallableExample {// 实现Callable接口static class MyCallable implements Callable<String> {@Overridepublic String call() throws Exception {// 模拟一个耗时操作Thread.sleep(1000);return "Callable任务执行完成";}}public static void main(String[] args) {// 创建Callable实例MyCallable callable = new MyCallable();// 使用FutureTask包装CallableFutureTask<String> futureTask = new FutureTask<>(callable);// 创建线程并启动Thread thread = new Thread(futureTask);thread.start();try {// 获取Callable的返回结果String result = futureTask.get();System.out.println(result);} catch (InterruptedException | ExecutionException e) {e.printStackTrace();}}
}

http://www.xdnf.cn/news/6025.html

相关文章:

  • 双向长短期记忆网络-BiLSTM
  • 鸿蒙OSUniApp打造多功能图表展示组件 #三方框架 #Uniapp
  • 行项目违反范围截止值
  • electron结合vue,直接访问静态文件如何跳转访问路径
  • 【IPMV】图像处理与机器视觉:Lec11 Keypoint Features and Corners
  • 以太网供电(PoE)交换机与自愈网络功能:打卡系统的得力助手
  • 基于 Spring Boot 瑞吉外卖系统开发(十四)
  • Vue 和 React 状态管理的性能优化策略对比
  • 数据结构中的高级排序算法
  • Linux内核可配置的参数
  • 单片机-STM32部分:14、SPI
  • 查询公网IP地址的方法:查看自己是不是公网ip,附内网穿透外网域名访问方案
  • 构建优雅对象的艺术:Java 建造者模式的架构解析与工程实践
  • HarmonyOs开发之———使用HTTP访问网络资源
  • Eslint和perrier的作用
  • CSS盒子模型:Padding与Margin的适用场景与注意事项
  • npm 报错 gyp verb `which` failed Error: not found: python2 解决方案
  • 【漫话机器学习系列】259.神经网络参数的初始化(Initialization Of Neural Network Parameters)
  • 【Java面试题】——this 和 super 的区别
  • PHP黑白胶卷底片图转彩图功能 V2025.05.15
  • Stable Diffusion WebUI 插件大全:功能详解与下载地址
  • 【软件测试】:推荐一些接口与自动化测试学习练习网站(API测试与自动化学习全攻略)
  • 配置Nginx解决http host头攻击漏洞【详细步骤】
  • Dockerfile实战:从零构建自定义CentOS镜像
  • Python爬虫实战:研究进制流数据,实现逆向解密
  • 【优选算法 | 字符串】字符串模拟题精选:思维+实现解析
  • 【python实用小脚本-59】连续刷题7天,手动整理编程题目效率低下,Python代码5分钟搞定,效率提升80%(附方案)
  • 力扣刷题Day 48:盛最多水的容器(283)
  • Linux操作系统中的SOCKET相关 - Socket字节序调整与网络传输
  • Kubernetes 标签和注解