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

Java构建线程的方式

1. 继承Thread类

通过创建一个继承自Thread类的子类,然后覆盖run()方法来定义线程的执行逻辑。

class MyThread extends Thread {public void run() {// 线程执行的代码System.out.println("Thread is running");}
}public class Main {public static void main(String[] args) {MyThread myThread = new MyThread();myThread.start(); // 启动线程}
}

2. 实现Runnable接口

通过创建一个实现Runnable接口的类,然后将该类的实例传递给Thread类的构造函数。

class MyRunnable implements Runnable {public void run() {// 线程执行的代码System.out.println("Runnable is running");}
}public class Main {public static void main(String[] args) {MyRunnable myRunnable = new MyRunnable();Thread thread = new Thread(myRunnable);thread.start(); // 启动线程}
}

3.实现Callable

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;class MyCallable implements Callable<String> {public String call() throws Exception {// 线程执行的代码,并返回一个结果return "Callable is running";}
}public class Main {public static void main(String[] args) {// 创建一个Callable任务Callable<String> callable = new MyCallable();// 将Callable任务封装成一个FutureTaskFutureTask<String> futureTask = new FutureTask<>(callable);// 将FutureTask传递给Thread构造函数创建线程Thread thread = new Thread(futureTask);thread.start(); // 启动线程try {// 获取线程执行结果String result = futureTask.get();System.out.println(result);} catch (InterruptedException | ExecutionException e) {e.printStackTrace();}}
}

4.线程池

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class ThreadPoolExample {public static void main(String[] args) {// 创建一个固定大小的线程池,大小为3ExecutorService executorService = Executors.newFixedThreadPool(3);// 提交任务给线程池for (int i = 1; i <= 5; i++) {final int taskId = i;executorService.submit(() -> {System.out.println("Task " + taskId + " is running on thread " + Thread.currentThread().getName());});}// 关闭线程池executorService.shutdown();}
}

在这个例子中,通过Executors.newFixedThreadPool(3)创建一个包含3个线程的固定大小线程池。然后通过executorService.submit()方法提交任务给线程池执行。最后,调用executorService.shutdown()来关闭线程池。

线程池的好处包括:

  1. 线程重用: 可以重复使用已创建的线程,减少线程创建和销毁的开销。

  2. 线程管理: 线程池提供了一些方法来管理线程的生命周期,例如启动、停止和等待。

  3. 资源控制: 可以限制线程的数量,以控制系统资源的使用。

  4. 性能提升: 通过合理配置线程池的大小,可以提高任务的执行效率。

相关文章:

  • 基于ESP32的Blinker控制四路继电器连接RYG灯和白灯+蜂鸣器
  • vue3+vite4中使用svg,使用iconfont-svg图标
  • K8S(七)—污点、容忍
  • mysql的BIT数值类型
  • 微信小程序scroll-view的scroll-into-view和vanUI的tabs标签结合使用
  • 智能优化算法应用:基于共生生物算法3D无线传感器网络(WSN)覆盖优化 - 附代码
  • Nginx的stream配置
  • [足式机器人]Part2 Dr. CAN学习笔记-数学基础Ch0-7欧拉公式的证明
  • 如何在Facebook Business Manager进行企业认证
  • 骨灰级程序员那些年曾经告诉我们的高效学习的态度
  • mysql 数据库
  • Re9 Attention is all you need
  • 2.4 C语言之运算符
  • 1、springboot项目运行报错
  • Spring Boot+FreeMarker=打造高效Web应用
  • java2019面试题北京
  • JavaScript 一些 DOM 的知识点
  • JavaScript标准库系列——Math对象和Date对象(二)
  • Java反射-动态类加载和重新加载
  • js对象的深浅拷贝
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • Linux下的乱码问题
  • Material Design
  • mockjs让前端开发独立于后端
  • PHP 小技巧
  • Python进阶细节
  • 包装类对象
  • 程序员最讨厌的9句话,你可有补充?
  • 复习Javascript专题(四):js中的深浅拷贝
  • 首页查询功能的一次实现过程
  • 说说动画卡顿的解决方案
  • 我感觉这是史上最牛的防sql注入方法类
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 怎么把视频里的音乐提取出来
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • # centos7下FFmpeg环境部署记录
  • #Linux(帮助手册)
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #mysql 8.0 踩坑日记
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (pojstep1.1.2)2654(直叙式模拟)
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)ssm码农论坛 毕业设计 231126
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (五)c52学习之旅-静态数码管
  • (一)appium-desktop定位元素原理
  • (转)菜鸟学数据库(三)——存储过程
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET CLR Hosting 简介
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .net 调用php,php 调用.net com组件 --
  • .NetCore 如何动态路由
  • .NET成年了,然后呢?
  • .NET框架类在ASP.NET中的使用(2) ——QA