多线程的创建与常见使用方法

一、多线程创建方式
1. 继承Thread类
class MyThread extends Thread {@Overridepublic void run() {// 线程执行逻辑System.out.println(Thread.currentThread().getName() + " is running");}
}// 使用
MyThread thread = new MyThread();
thread.start(); // 启动线程
2. 实现Runnable接口
class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + " is running");}
}// 使用
Thread thread = new Thread(new MyRunnable());
thread.start();
​3. Android特有方式
// HandlerThread(自带Looper)
HandlerThread handlerThread = new HandlerThread("WorkerThread");
handlerThread.start();
Handler handler = new Handler(handlerThread.getLooper()) {@Overridepublic void handleMessage(Message msg) {// 后台线程处理消息}
};// 发送消息
handler.sendEmptyMessage(0);

二、线程池使用(推荐方式)​
1. 创建线程池
// 固定大小线程池
ExecutorService fixedPool = Executors.newFixedThreadPool(4);// 缓存线程池(自动扩容)
ExecutorService cachedPool = Executors.newCachedThreadPool();// 单线程池(顺序执行)
ExecutorService singleThreadPool = Executors.newSingleThreadExecutor();
2. 提交任务
// 执行Runnable任务
fixedPool.execute(() -> {System.out.println("Task running in thread pool");
});// 提交Callable任务并获取Future
Future<String> future = fixedPool.submit(() -> {return "Task result";
});
3. 自定义线程池
ThreadPoolExecutor customPool = new ThreadPoolExecutor(4, // 核心线程数10, // 最大线程数60, // 空闲线程存活时间(秒)TimeUnit.SECONDS,new LinkedBlockingQueue<>(100) // 任务队列
);// 拒绝策略(当队列满时)
customPool.setRejectedExecutionHandler((task, executor) -> {System.err.println("Task rejected: " + task);
});

1. 交替打印数字(两个线程协作)

题目​:两个线程交替打印1~100,一个线程打印奇数,另一个打印偶数

public class AlternatePrint {private int num = 1;private final Object lock = new Object();public void printOdd() {synchronized (lock) {while (num <= 100) {if (num % 2 == 1) {System.out.println(Thread.currentThread().getName() + ": " + num++);lock.notify(); // 唤醒偶数线程} else {try {lock.wait(); // 等待偶数线程通知} catch (InterruptedException e) {Thread.currentThread().interrupt();}}}}}public void printEven() {synchronized (lock) {while (num <= 100) {if (num % 2 == 0) {System.out.println(Thread.currentThread().getName() + ": " + num++);lock.notify(); // 唤醒奇数线程} else {try {lock.wait(); // 等待奇数线程通知} catch (InterruptedException e) {Thread.currentThread().interrupt();}}}}}public static void main(String[] args) {AlternatePrint printer = new AlternatePrint();new Thread(printer::printOdd, "OddThread").start();new Thread(printer::printEven, "EvenThread").start();}
}
2. 生产者-消费者模型(缓冲区管理)

题目​:实现生产者线程生成数据,消费者线程消费数据,使用阻塞队列控制

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;public class ProducerConsumer {private static final int CAPACITY = 5;private final BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(CAPACITY);public void produce() throws InterruptedException {int value = 0;while (true) {synchronized (this) {while (queue.size() == CAPACITY) {wait(); // 缓冲区满时等待}queue.put(value);System.out.println("Produced: " + value);value++;notifyAll(); // 通知消费者}Thread.sleep(100); // 模拟生产耗时}}public void consume() throws InterruptedException {while (true) {synchronized (this) {while (queue.isEmpty()) {wait(); // 缓冲区空时等待}int value = queue.take();System.out.println("Consumed: " + value);notifyAll(); // 通知生产者}Thread.sleep(150); // 模拟消费耗时}}public static void main(String[] args) {ProducerConsumer pc = new ProducerConsumer();new Thread(() -> {try { pc.produce(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); }}, "Producer").start();new Thread(() -> {try { pc.consume(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); }}, "Consumer").start();}
}
3. 多线程顺序打印(线程协同)

题目​:三个线程按顺序循环打印ABC各10次

public class SequentialPrinter {private final Object lock = new Object();private String state = "A";public void printA() {synchronized (lock) {for (int i = 0; i < 10; ) {if (state.equals("A")) {System.out.print("A");state = "B";i++;lock.notifyAll(); // 唤醒所有等待线程} else {try {lock.wait(); // 等待条件满足} catch (InterruptedException e) {Thread.currentThread().interrupt();}}}}}// 类似实现printB()和printC()public void printB() {synchronized (lock) {for (int i = 0; i < 10; ) {if (state.equals("B")) {System.out.print("B");state = "C";i++;lock.notifyAll();} else {try {lock.wait();} catch (InterruptedException e) {Thread.currentThread().interrupt();}}}}}public void printC() {synchronized (lock) {for (int i = 0; i < 10; ) {if (state.equals("C")) {System.out.print("C ");state = "A";i++;lock.notifyAll();} else {try {lock.wait();} catch (InterruptedException e) {Thread.currentThread().interrupt();}}}}}public static void main(String[] args) {SequentialPrinter printer = new SequentialPrinter();new Thread(printer::printA, "Thread-A").start();new Thread(printer::printB, "Thread-B").start();new Thread(printer::printC, "Thread-C").start();}
}
4. 多线程计算素数(任务分发)

题目​:使用线程池计算1~N范围内素数的数量

import java.util.concurrent.*;public class PrimeCounter {public static void main(String[] args) throws Exception {final int N = 1000000;final int THREADS = Runtime.getRuntime().availableProcessors();ExecutorService executor = Executors.newFixedThreadPool(THREADS);int segment = N / THREADS;Future<Integer>[] results = new Future[THREADS];// 分发任务for (int i = 0; i < THREADS; i++) {final int start = i * segment + 1;final int end = (i == THREADS - 1) ? N : (i + 1) * segment;results[i] = executor.submit(() -> {int count = 0;for (int num = start; num <= end; num++) {if (isPrime(num)) count++;}return count;});}// 汇总结果int totalPrimes = 0;for (Future<Integer> future : results) {totalPrimes += future.get();}System.out.println("Total primes: " + totalPrimes);executor.shutdown();}private static boolean isPrime(int n) {if (n <= 1) return false;if (n == 2) return true;if (n % 2 == 0) return false;for (int i = 3; i <= Math.sqrt(n); i += 2) {if (n % i == 0) return false;}return true;}
}
5. 自定义简单线程池

题目​:实现一个固定大小的线程池,支持提交任务和执行任务

import java.util.concurrent.*;
import java.util.*;public class SimpleThreadPool {private final BlockingQueue<Runnable> taskQueue;private final List<WorkerThread> workers;private volatile boolean isShutdown = false;public SimpleThreadPool(int poolSize) {this.taskQueue = new LinkedBlockingQueue<>();this.workers = new ArrayList<>();for (int i = 0; i < poolSize; i++) {WorkerThread worker = new WorkerThread("Worker-" + i);worker.start();workers.add(worker);}}public void execute(Runnable task) {if (isShutdown) {throw new IllegalStateException("ThreadPool is shutdown");}taskQueue.offer(task);}public void shutdown() {isShutdown = true;workers.forEach(Thread::interrupt);}private class WorkerThread extends Thread {public WorkerThread(String name) {super(name);}@Overridepublic void run() {while (!isShutdown || !taskQueue.isEmpty()) {try {Runnable task = taskQueue.take();task.run();} catch (InterruptedException e) {// 处理中断,结束线程}}}}public static void main(String[] args) {SimpleThreadPool pool = new SimpleThreadPool(4);// 提交任务for (int i = 0; i < 10; i++) {final int taskId = i;pool.execute(() -> {System.out.println(Thread.currentThread().getName() + " executing Task-" + taskId);try {Thread.sleep(500);} catch (InterruptedException e) {Thread.currentThread().interrupt();}});}// 等待任务完成try {Thread.sleep(3000);} catch (InterruptedException e) {Thread.currentThread().interrupt();}pool.shutdown();}
}

字符串算法总结

1. 字符串反转

题目​:反转字符串或单词顺序

// 整个字符串反转
public String reverseString(String s) {char[] chars = s.toCharArray();int left = 0, right = chars.length - 1;while (left < right) {char temp = chars[left];chars[left++] = chars[right];chars[right--] = temp;}return new String(chars);
}// 单词顺序反转(保留空格)
public String reverseWords(String s) {String[] words = s.trim().split("\\s+");StringBuilder sb = new StringBuilder();for (int i = words.length - 1; i >= 0; i--) {sb.append(words[i]);if (i > 0) sb.append(" ");}return sb.toString();
}
2. 字符串转换整数 (atoi)

题目​:处理边界条件(空格/正负号/溢出)

public int myAtoi(String s) {int index = 0, sign = 1, total = 0;// 1. 跳过空格while (index < s.length() && s.charAt(index) == ' ') index++;if (index == s.length()) return 0;// 2. 处理正负号if (s.charAt(index) == '+' || s.charAt(index) == '-') {sign = s.charAt(index) == '+' ? 1 : -1;index++;}// 3. 转换数字并处理溢出while (index < s.length()) {int digit = s.charAt(index) - '0';if (digit < 0 || digit > 9) break;// 检查溢出if (total > Integer.MAX_VALUE / 10 || (total == Integer.MAX_VALUE / 10 && digit > 7)) {return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;}total = total * 10 + digit;index++;}return total * sign;
}
3. 最长公共前缀

题目​:查找字符串数组的最长公共前缀

public String longestCommonPrefix(String[] strs) {if (strs == null || strs.length == 0) return "";for (int i = 0; i < strs[0].length(); i++) {char c = strs[0].charAt(i);for (int j = 1; j < strs.length; j++) {if (i == strs[j].length() || strs[j].charAt(i) != c) {return strs[0].substring(0, i);}}}return strs[0];
}
4. 无重复字符的最长子串

题目​:滑动窗口经典应用

public int lengthOfLongestSubstring(String s) {Map<Character, Integer> map = new HashMap<>();int maxLen = 0;for (int left = 0, right = 0; right < s.length(); right++) {char c = s.charAt(right);if (map.containsKey(c)) {left = Math.max(left, map.get(c) + 1); // 跳过重复字符}map.put(c, right);maxLen = Math.max(maxLen, right - left + 1);}return maxLen;
}
5. 最长回文子串

题目​:中心扩展法

public String longestPalindrome(String s) {if (s == null || s.length() < 1) return "";int start = 0, end = 0;for (int i = 0; i < s.length(); i++) {int len1 = expand(s, i, i);      // 奇数长度int len2 = expand(s, i, i + 1);  // 偶数长度int len = Math.max(len1, len2);if (len > end - start) {start = i - (len - 1) / 2;end = i + len / 2;}}return s.substring(start, end + 1);
}private int expand(String s, int left, int right) {while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {left--;right++;}return right - left - 1;
}
6. 字符串匹配算法(KMP)

题目​:实现 strStr()

public int strStr(String haystack, String needle) {if (needle.isEmpty()) return 0;int[] next = getNext(needle);int i = 0, j = 0;while (i < haystack.length()) {if (j == -1 || haystack.charAt(i) == needle.charAt(j)) {i++;j++;} else {j = next[j];}if (j == needle.length()) {return i - j;}}return -1;
}private int[] getNext(String pattern) {int[] next = new int[pattern.length()];next[0] = -1;int i = 0, j = -1;while (i < pattern.length() - 1) {if (j == -1 || pattern.charAt(i) == pattern.charAt(j)) {i++;j++;next[i] = j;} else {j = next[j];}}return next;
}
7. 有效的括号

题目​:栈的经典应用

public boolean isValid(String s) {Stack<Character> stack = new Stack<>();for (char c : s.toCharArray()) {if (c == '(') stack.push(')');else if (c == '[') stack.push(']');else if (c == '{') stack.push('}');else if (stack.isEmpty() || stack.pop() != c) return false;}return stack.isEmpty();
}
8. 字母异位词分组

题目​:HashMap的巧妙使用

public List<List<String>> groupAnagrams(String[] strs) {Map<String, List<String>> map = new HashMap<>();for (String s : strs) {char[] chars = s.toCharArray();Arrays.sort(chars);String key = new String(chars);map.computeIfAbsent(key, k -> new ArrayList<>()).add(s);}return new ArrayList<>(map.values());
}
9. 编辑距离(动态规划)

题目​:计算最小操作次数

public int minDistance(String word1, String word2) {int m = word1.length(), n = word2.length();int[][] dp = new int[m + 1][n + 1];for (int i = 0; i <= m; i++) dp[i][0] = i;for (int j = 0; j <= n; j++) dp[0][j] = j;for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {if (word1.charAt(i - 1) == word2.charAt(j - 1)) {dp[i][j] = dp[i - 1][j - 1];} else {dp[i][j] = 1 + Math.min(dp[i - 1][j - 1], Math.min(dp[i][j - 1], dp[i - 1][j]));}}}return dp[m][n];
}
10. 字符串解码

题目​:嵌套括号处理

public String decodeString(String s) {Stack<Integer> numStack = new Stack<>();Stack<StringBuilder> strStack = new Stack<>();StringBuilder cur = new StringBuilder();int num = 0;for (char c : s.toCharArray()) {if (Character.isDigit(c)) {num = num * 10 + (c - '0');} else if (c == '[') {numStack.push(num);strStack.push(cur);cur = new StringBuilder();num = 0;} else if (c == ']') {StringBuilder tmp = cur;cur = strStack.pop();int repeat = numStack.pop();for (int i = 0; i < repeat; i++) {cur.append(tmp);}} else {cur.append(c);}}return cur.toString();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/85415.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/85415.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/85415.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大模型调用数据库表实践:基于自然语言的SQL生成与数据查询系统

# 大模型调用数据库表实践&#xff1a;基于自然语言的SQL生成与数据查询系统 ## 一、背景与目标 在企业数据管理场景中&#xff0c;非技术人员&#xff08;如业务人员、管理人员&#xff09;常常需要通过数据库查询获取关键信息&#xff0c;但直接编写SQL语句存在技术门槛。传…

28 C 语言作用域详解:作用域特性(全局、局部、块级)、应用场景、注意事项

1 作用域简介 作用域定义了代码中标识符&#xff08;如变量、常量、数组、函数等&#xff09;的可见性与可访问范围&#xff0c;即标识符在程序的哪些位置能够被引用或访问。在 C 语言中&#xff0c;作用域主要分为三类&#xff1a; 全局作用域局部作用域块级作用域 需注意&am…

Tomcat运行比较卡顿进行参数调优

在Tomcat conf/catalina.bat或catalina.sh中 的最上面增加参数 1. 初步调整参数&#xff08;缓解问题&#xff09; set JAVA_OPTS -Xms6g -Xmx6g -Xmn3g # 增大新生代&#xff0c;减少对象过早晋升到老年代 -XX:MetaspaceSize256m -XX:MaxMetaspaceS…

WSL2 安装与Docker安装

注意&#xff1a;如没有科学上网请勿尝试&#xff0c;无法判断是否会因网络错误导致的安装失败&#xff01;&#xff01;&#xff01; WSL2&#xff08;Windows Subsystem for Linux 2&#xff09; 功能简介&#xff1a; WSL2 是微软提供的在 Windows 上运行完整 Linux 内核的…

Redis的安装与使用

网址&#xff1a;Spring Data Redis 安装包&#xff1a;Releases tporadowski/redis GitHub 解压后 在安装目录中打开cmd 打开服务&#xff08;注意&#xff1a;每次客户端连接都有先打开服务&#xff01;&#xff01;&#xff01;&#xff09; 按ctrlC退出服务 客户端连接…

springboot-响应接收与ioc容器控制反转、Di依赖注入

1.想将服务器中的数据返回给客户端&#xff0c;需要在controller类上加注解&#xff1a;ResponseBody; 这个注解其实在前面已经使用过&#xff0c;RestController其实就包含两个注解&#xff1a; Controller ResponseBody 返回值如果是实体对象/集合&#xff0c;将会转换为j…

将材质球中的纹理属性对应的贴图保存至本地

通过Texture2D的EncodeToPNG方法将纹理转为图片形式 material.GetTexture方法通过属性名获取纹理贴图 material.SetTexture方法通过属性名设置纹理贴图 属性名可在shader代码中查看 using UnityEngine; using System.IO;public class TextureSaver : MonoBehaviour {public…

MySQL半同步复制配置和参数详解

目录 1 成功配置主从复制 2 加载插件 3 半同步复制监控 4 半同步复制参数 1 成功配置主从复制 操作步骤参考&#xff1a;https://blog.csdn.net/zyb378747350/article/details/148309545 2 加载插件 #主库上 MySQL 8.0.26 之前版本: mysql>INSTALL PLUGIN rpl_semi_syn…

【笔记】Windows 成功部署 Suna 开源的通用人工智能代理项目部署日志

#工作记录 本地部署运行截图 kortix-ai/suna&#xff1a; Suna - 开源通用 AI 代理 项目概述 Suna 是一个完全开源的 AI 助手&#xff0c;通过自然对话帮助用户轻松完成研究、数据分析等日常任务。它结合了强大的功能和直观的界面&#xff0c;能够理解用户需求并提供结果。其强…

PCB制作入门

文章目录 1 嘉立创使用旋转 2元器件选择MP2315SLM7815与LM7915 1 嘉立创使用 旋转 空格旋转 2元器件选择 MP2315S MP2315S 是一款内置功率 MOSFET 的高效率同步整流降压开关变换器。 其输入电压范围为 4.5V 至 24V &#xff0c;能实现 3A 连续输出电流&#xff0c;负载与…

2025——》NumPy中的np.logspace使用/在什么场景下适合使用np.logspace?NumPy中的np.logspace用法详解

1.NumPy中的np.logspace使用: 在 NumPy 中,np.logspace函数用于生成对数尺度上等间距分布的数值序列,适用于科学计算、数据可视化等需要对数间隔数据的场景。以下是其核心用法和关键细节: 一、基础语法与参数解析: numpy.logspace(start, stop, num=50, endpoint=True, ba…

Java实现中文姓名转拼音生成用户信息并写入文件

中文姓名转拼音 Java实现中文姓名转拼音生成用户信息并写入文件&#xff08;shili域名版&#xff09;一、项目背景与功能简介二、技术栈与核心组件2.1 主要技术2.2 功能模块 三、核心代码解析3.1 主函数逻辑&#xff08;流程控制&#xff09;3.2 拼音转换模块&#xff08;核心功…

Google car key:安全、便捷的汽车解锁新选择

有了兼容的汽车和 Android 手机&#xff0c;Google car key可让您将Android 手机用作车钥匙。您可以通过兼容的 Android 手机锁定、解锁、启动汽车并执行更多功能。但是&#xff0c;Google car key安全吗&#xff1f;它是如何工作的&#xff1f;如果我的手机电池没电了怎么办&a…

如何轻松将 iPhone 备份到外部硬盘

当您的iPhone和电脑上的存储空间有限时&#xff0c;您可能希望将iPhone备份到外部硬盘上&#xff0c;这样可以快速释放iPhone上的存储空间&#xff0c;而不占用电脑上的空间&#xff0c;并为您的数据提供额外的安全性。此外&#xff0c;我们还提供 4 种有效的解决方案&#xff…

AI炼丹日志-22 - MCP 自动操作 Figma+Cursor 自动设计原型

MCP 基本介绍 官方地址&#xff1a; https://modelcontextprotocol.io/introduction “MCP 是一种开放协议&#xff0c;旨在标准化应用程序向大型语言模型&#xff08;LLM&#xff09;提供上下文的方式。可以把 MCP 想象成 AI 应用程序的 USB-C 接口。就像 USB-C 提供了一种…

机器学习-线性回归基础

一、什么是回归 依据输入x写出一个目标值y的计算方程&#xff0c;求回归系数的过程就叫回归。简言之&#xff1a;根据题意列出方程&#xff0c;求出系数的过程就叫做回归。 回归的目的是预测数值型的目标值y&#xff0c;分类的目的预测标称型的目标值y。 二、线性回归 2.1线性…

解决RAGFlow(v0.19.0)有部分PDF无法解析成功的问题。

ragflow版本为&#xff1a;v0.19.0 1.解析的时候报错&#xff1a;Internal server error while chunking: Coordinate lower is less than upper。 看报错怀疑是分片的问题&#xff0c;于是把文档的切片方法中的“建议文本块大小”数值&#xff08;默认512&#xff09;调小&…

【前端】html2pdf实现用前端下载pdf

npm安装完后&#xff0c;编写代码。 <template><div id"pdf-content">需要被捕获为pdf的内容</div> </template><script> import html2pdf from html2pdf.js;export default {methods: {downloadPdf() {const element document.getE…

从零实现富文本编辑器#4-浏览器选区模型的核心交互策略

先前我们提到了&#xff0c;数据模型的设计是编辑器的基础模块&#xff0c;其直接影响了选区模块的表示。选区模块的设计同样是编辑器的基础部分&#xff0c;编辑器应用变更时操作范围的表达&#xff0c;就需要基于选区模型来实现&#xff0c;也就是说选区代表的意义是编辑器需…

数论——质数和合数及求质数

质数、合数和质数筛 质数和合数及求质数试除法判断质数Eratosthenes筛选法&#xff08;埃氏筛&#xff09;线性筛&#xff08;欧拉筛&#xff09; 质数有关OJ列举P1835 素数密度 - 洛谷简单的哥赫巴德猜想和cin优化 质数和合数及求质数 一个大于 1 的自然数&#xff0c;除了 1…