当前位置: 首页 > 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应用
  • input的行数自动增减
  • JAVA并发编程--1.基础概念
  • PAT A1017 优先队列
  • Quartz初级教程
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • windows下使用nginx调试简介
  • 阿里云前端周刊 - 第 26 期
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 欢迎参加第二届中国游戏开发者大会
  • 面试总结JavaScript篇
  • 前端
  • 设计模式 开闭原则
  • 实现菜单下拉伸展折叠效果demo
  • 协程
  • 学习JavaScript数据结构与算法 — 树
  • 移动端解决方案学习记录
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (LeetCode C++)盛最多水的容器
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET CLR Hosting 简介
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .NET 的程序集加载上下文
  • .NET4.0并行计算技术基础(1)
  • .net6使用Sejil可视化日志
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .NET基础篇——反射的奥妙
  • .NET下ASPX编程的几个小问题
  • .vollhavhelp-V-XXXXXXXX勒索病毒的最新威胁:如何恢复您的数据?
  • ??在JSP中,java和JavaScript如何交互?
  • @property @synthesize @dynamic 及相关属性作用探究
  • [20161214]如何确定dbid.txt
  • [Angularjs]ng-select和ng-options
  • [C/C++] -- 二叉树
  • [codeforces]Checkpoints