Java中创建线程的几种方式
底层都是基于实现Runnable接口
1.继承thread类,new一个thread对象,实现run方法,无返回值
public class MyThread extends Thread {@Overridepublic void run() {System.out.println("Thread created by extending Thread class is running.");}public static void main(String[] args) {MyThread myThread = new MyThread();myThread.start();}
}
2.实现Runnable接口,new一个thread对象,实现run方法,无返回值
public class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("Thread created by implementing Runnable interface is running.");}public static void main(String[] args) {MyRunnable myRunnable = new MyRunnable();Thread thread = new Thread(myRunnable);thread.start();}
}
3.实现Callable接口,new一个thread对象
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;public class MyCallable implements Callable<String> {@Overridepublic String call() throws Exception {return "Thread created by implementing Callable interface is running.";}public static void main(String[] args) {MyCallable myCallable = new MyCallable();FutureTask<String> futureTask = new FutureTask<>(myCallable);Thread thread = new Thread(futureTask);thread.start();try {String result = futureTask.get();System.out.println(result);} catch (InterruptedException | ExecutionException e) {e.printStackTrace();}}
}
4.线程池,实现Runnable接口
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;public class WebCrawler {private static final int THREAD_POOL_SIZE = 10;public static void main(String[] args) {List<String> urls = new ArrayList<>();urls.add("https://example.com/page1");urls.add("https://example.com/page2");urls.add("https://example.com/page3");// 添加更多的URLExecutorService executorService = Executors.newFixedThreadPool(THREAD_POOL_SIZE);for (String url : urls) {executorService.execute(new CrawlTask(url));}executorService.shutdown();try {executorService.awaitTermination(1, TimeUnit.HOURS);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("All tasks completed.");}static class CrawlTask implements Runnable {private final String url;CrawlTask(String url) {this.url = url;}@Overridepublic void run() {try {URL urlObj = new URL(url);BufferedReader reader = new BufferedReader(new InputStreamReader(urlObj.openStream()));String inputLine;StringBuilder content = new StringBuilder();while ((inputLine = reader.readLine()) != null) {content.append(inputLine);}reader.close();// 假设这里我们将内容存储到数据库storeInDatabase(content.toString());System.out.println("Crawled: " + url);} catch (Exception e) {e.printStackTrace();}}private void storeInDatabase(String content) {// 实现存储逻辑System.out.println("Storing content from: " + url);}}
}
相关文章:
Java中创建线程的几种方式
底层都是基于实现Runnable接口 1.继承thread类,new一个thread对象,实现run方法,无返回值 public class MyThread extends Thread {Overridepublic void run() {System.out.println("Thread created by extending Thread class is runn…...
[A-04] ARMv8/ARMv9-Cache的相关策略
ver0.2 前言 前面我们已经通过三篇文章反反复复的讲Cache的概念、结构、架构,相信大家对Cache已经大概有了初步的了解。这里简单归纳一下: (1) Cache从硬件视角看,是连接PE-Core和主存的一种存储介质,存储的数据是主存中数据的副本…...
【笔试常见编程题06】最近公共祖先、求最大连续bit数、二进制插入、查找组成一个偶数最接近的两个素数
1. 最近公共祖先 将一棵无穷大满二叉树的结点按根结点一层一层地从左往右编号,根结点编号为1。现给定a,b为两个结点。设计一个算法,返回a、b最近的公共祖先的编号。注意其祖先也可能是结点本身。 测试样例: 2,3 返回&a…...
【工具分享】Gophish——网络钓鱼框架
文章目录 Gophish安装方式功能简介 Gophish Gophish 是一个开源的网络钓鱼框架,它被设计用于模拟真实世界的钓鱼攻击,以帮助企业和渗透测试人员测试和评估他们的网络钓鱼风险。Gophish 旨在使行业级的网络钓鱼培训对每个人都是可获取的,它易…...
“职业三大底层逻辑“是啥呢?
大家好,我是有用就扩散。 掌握职业发展的三大底层逻辑以宏观视角看待自己的职业发展道路具备长远规划自己职业路劲的能力通过成就事件呈现自己的工作成绩 一、痛点陈述 不喜欢眼前的工作?眼前的工作琐碎没前途?找不到能力提升的方向时候会…...
飞睿智能无线高速uwb安全数据传输模块,低功耗、抗干扰超宽带uwb芯片传输速度技术新突破
在信息化的时代,数据传输的速度和安全性无疑是每个企业和个人都极为关注的话题。随着科技的飞速发展,超宽带(Ultra-Wideband,简称UWB)技术凭借其性能和广泛的应用前景,逐渐成为了数据传输领域的新星。今天&…...
手把手教你从微信中取出聊天表情图片,以动态表情保存为gif为例
以下方法静态图片同样适用 收到动画表情像保存为gif 这时候我们就要借助微信官方的文件小助手网页版。 登录之后把要保存的表情转发给微信传输助手 这个时候就会出现将图像另存为 如果需要保存动图就修改后缀为.gif...
【深度学习】图形模型基础(5):线性回归模型第三部分:线性回归模型拟合
1.引言 本博文专辑的焦点主要集中在回归模型的实用案例和工具上,从简单的单变量线性回归入手,逐步过渡到包含多个预测变量、非线性模型,以及在预测和因果推断中的应用。本文我们将介绍回归模型推断的一些数学结构,并提供一些代数…...
【Git 入门】初始化配置与新建仓库
文章目录 前言配置git新建仓库仓库的概念创建仓库命令总结前言 在现代软件开发中,版本控制系统已经成为了不可或缺的工具。其中,Git 是最为广泛使用的版本控制系统之一。Git 不仅可以帮助我们管理和跟踪代码的变化,还可以方便地与他人协作。本文将介绍 Git 的基础知识,包括…...
C语言 求两个整数的最大公约数和最小公倍数
写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输入。 #include <stdio.h>// 求最大公约数 int gcd(int a, int b) {while (b ! 0) {int temp b;b a % b;a temp;}return a; }// 求最小公倍数 int lcm(int a,…...
Linux arm64平台指令替换函数 aarch64_insn_patch_text_nosync
文章目录 前言一、简介1.1 aarch64_insn_patch_text_nosync1.2 aarch64_insn_write1.3 patch_map1.4 set_fixmap_offset1.5 __set_fixmap 二、用途2.1 jump lable2.2 ftrace 参考资料 前言 这篇文章介绍了 Linux x86_64平台指令替换函数 text_poke_smp/bp 接下来介绍arm64平台…...
谷歌浏览器插件开发笔记0.1.033
谷歌浏览器插件开发笔记0.1.000 示例文件manifest.jsonpopup.htmloptions.jsoptions.htmlcontent.jsbackground.js 网页按钮快捷键插件api使用基础参考链接 示例文件 共计有6个常用的文件 manifest.json background字段:随着浏览器的打开而打开,随着浏…...
ETag:Springboot接口如何添加Tag
ETag简介 在Web开发中,ETag(Entity Tag)是一种HTTP头字段,用于标识特定版本的资源。ETag的主要用途是缓存控制和优化,通过比较客户端和服务器资源的ETag值,可以判断资源是否发生变化,从而避免不…...
JavaSe系列二十七: Java正则表达式
正则表达式 为什么要学习正则表达式再提几个问题解决之道-正则表达式正则表达式基本介绍介绍 正则表达式底层实现实例分析 正则表达式语法基本介绍元字符-转义号 \\\\元字符-字符匹配符元字符-选择匹配符元字符-限定符元字符-定位符分组非贪婪匹配 应用实例对字符串进行如下验证…...
(深度估计学习)Depth Anything V2 复现
Depth Anything V2 复现 一、配置环境二、准备数据1. 权重文件2. 训练数据 三、Test四、Train 代码:https://github.com/DepthAnything/Depth-Anything-V2 一、配置环境 在本机电脑win跑之后依旧爆显存,放到服务器跑:Ubuntu22.04,…...
C语言——printf、scanf、其他输入输出函数
printf函数 1.printf 函数的一般格式: printf 函数的一般格式为printf(格式控制,输出表列) 例如: printf("%d,%c\n",i,c); (1)“格式控制" 是用双撇号括起来的一个字符串,称“转换控制字符串”,简称“格式字符串”。它包括…...
adb 常用的命令总结
1、adb logcat 抓取日志 adb logcat > d:\log.txt Ctrlc 结束日志抓取 adb logcat -c > d:\log.txt 清空旧日志 发生Native Crash 时,抓取错误报告 adb logcat -b crash 抓取筛选后的日志: adb logcat -s AndroidRuntime > d:\log…...
Java发展过程中,JVM的演进
1. 初期的JVM(Java 1.0 到 Java 1.1) Java 1.0 于1996年发布,最初的JVM设计主要是为了跨平台兼容性和基本的垃圾回收功能。早期的JVM以解释执行字节码为主,性能相对较低。 2. 引入即时编译(JIT)ÿ…...
笔记:在Entity Framework Core中如何处理多线程操作DbContext
一、目的: 在使用Entity Framework Core (EF Core) 进行多线程操作时,需要特别注意,因为DbContext类并不是线程安全的。这意味着,你不能从多个线程同时使用同一个DbContext实例进行操作。尝试这样做可能会导致数据损坏、异常或不可…...
RabbitMQ 高级功能
RabbitMQ 是一个广泛使用的开源消息代理,它支持多种消息传递协议,可以在分布式系统中用于可靠的消息传递。除了基本的消息队列功能外,RabbitMQ 还提供了一些高级功能,增强了其在高可用性、扩展性和灵活性方面的能力。以下是一些主…...
XRF导向的土壤重金属定量分析方法与应用【附模型】
✨ 长期致力于X射线荧光、土壤重金属、本底扣除、重叠峰解析、光谱联用研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)非对称加权惩罚最小二乘本底扣…...
用RT-Thread Studio玩转STM32 PWM:从电机控制到呼吸灯,一个框架搞定
用RT-Thread Studio玩转STM32 PWM:从电机控制到呼吸灯,一个框架搞定 在嵌入式开发领域,PWM(脉冲宽度调制)技术堪称"瑞士军刀"般的存在。无论是调节电机转速、控制舵机角度,还是实现LED呼吸灯效果…...
你的方差分析做对了吗?避开SPSS中ANOVA的5个经典坑(从数据准备到结果报告)
你的方差分析做对了吗?避开SPSS中ANOVA的5个经典坑(从数据准备到结果报告) 在科研论文和市场调研中,方差分析(ANOVA)是最常用的统计方法之一。许多研究者虽然掌握了SPSS的基本操作,却在结果报告…...
Mainframer与IntelliJ IDEA完美集成:提升开发体验的7个技巧
Mainframer与IntelliJ IDEA完美集成:提升开发体验的7个技巧 【免费下载链接】mainframer Tool for remote builds. Sync project to remote machine, execute command, sync back. 项目地址: https://gitcode.com/gh_mirrors/ma/mainframer Mainframer是一款…...
简单掌握C++中的函数模板
1.函数模板的声明和模板函数的生成 1.1函数模板的声明 函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计。它的最大特点是把函数使用的数据类型作为参数。 函数模板的声明形式为: template<typenam…...
【RK3588-AI-004】RK3588 AI专属依赖环境预装(Python、OpenCV、基础编译工具)
📖 专栏介绍 本专栏为RK3588 端侧AI开发零基础实战教程,专为嵌入式AI入门、模型部署、视觉开发学习者打造。全程实操、无废话、避坑优化,从零搭建RK3588专属AI开发环境,手把手教学,新手也能轻松上手。 ✅ 硬件适配&am…...
SMARTFORM不同模板一起打印
一、背景由于客户提出发货单要加上条形码打印,条形码单独一个模板,加在后面打印,输出PDF并发送邮件。二、效果展示不同模板一起打印效果如下,建立smartforms的表单时,也使用了两个不同的模板三、smartforms建立表单&am…...
嘉立创EDA:原理图到PCB学习总结
1.原理图: 关于原理图绘制可以看项目需要哪些板块,去网上搜索开源项目跟着上面一步一步绘制即可,或者利用豆包来一步一步生成板块 主要要注意: 电源要加电容进行滤除杂波 一般带有功能的引脚是3.3V不要输入5V到这些IO口降压芯…...
从能算到秒杀:完全平方数与最少数量的数学真相
LeetCode Hot 100 刷题笔记 第 15 篇如果说「跳跃游戏 II」是在教你 什么时候不得不跳,那 279. 完全平方数 就是在考你:最少能用几个平方数,凑出一个整数?这也是我第一次意识到:有些动态规划,其实是在替…...
大家都在签电子合同了,对企业有什么好处?
一、电子合同,已经不是什么新鲜事了可能你身边还有人在犹豫电子合同靠不靠谱,但数据不会骗人。据统计,2025年我国电子合同签约量达到2576.1亿份,市场规模已经达到305.1亿元,这几年年均增速超过23%。说白了,…...
