如何实现一个多线程
发表于:2025-11-06 作者:千家信息网编辑
千家信息网最后更新 2025年11月06日,本篇文章为大家展示了如何实现一个多线程,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。传统线程测试:* 子线程循环10次,接着主线程循环100次,接着又回到子线
千家信息网最后更新 2025年11月06日如何实现一个多线程
本篇文章为大家展示了如何实现一个多线程,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
传统线程测试:* 子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着再回到主线程又循环100次,如此循环50次,请写出程序。
一、传统方法(隐式锁)实现
package com.lau.javabase.lock;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** * 传统线程测试: * 子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着再回到主线程又循环100次,如此循环50次,请写出程序。 */public class TraditionThreadExerciseTest { volatile Boolean executeInTurn = true; public synchronized void subTask(int times) throws Exception { while(!executeInTurn){ this.wait(); } for(int i = 1; i <= 10; i++){ System.out.println("子任务内部运行第" + i + "次," + "总第" + times + "次"); } executeInTurn = false; this.notify(); } public synchronized void mainTask(int times) throws Exception { while(executeInTurn){ this.wait(); } for(int i = 1; i <= 100; i++){ System.out.println("主任务内部运行第" + i + "次," + "总第" + times + "次"); } executeInTurn = true; this.notify(); } /** * @Description:特别注意:不能将主线程和子线程循环50次的调用写在一个for循环里, * 因为这样会导致后面的跑到前面去,引发错序打印问题 * @param args * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { TraditionThreadExerciseTest test = new TraditionThreadExerciseTest(); ExecutorService threadPool = Executors.newFixedThreadPool(4); threadPool.submit(() -> { try { for(int i = 1; i <= 50; i++) { test.subTask(i); } } catch (Exception e) { e.printStackTrace(); } }, "subThread"); threadPool.submit(() -> { try { for(int i = 1; i <= 50; i++) { test.mainTask(i); } } catch (Exception e) { e.printStackTrace(); } }, "mainThread"); threadPool.shutdown(); }}二、显示锁实现
package com.lau.javabase.lock;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * 传统线程测试: * 子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着再回到主线程又循环100次,如此循环50次,请写出程序。 */public class TraditionThreadLockTest { volatile Boolean executeInTurn = true; Lock lock = new ReentrantLock(); Condition condition = lock.newCondition(); public void subTask(int times) throws Exception { try{ lock.lock(); while(!executeInTurn){ condition.await(); } for(int i = 1; i <= 10; i++){ System.out.println("子任务内部运行第" + i + "次," + "总第" + times + "次"); } executeInTurn = false; condition.signal(); } finally { lock.unlock(); } } public void mainTask(int times) throws Exception { try{ lock.lock(); while(executeInTurn){ condition.await(); } for(int i = 1; i <= 100; i++){ System.out.println("主任务内部运行第" + i + "次," + "总第" + times + "次"); } executeInTurn = true; condition.signal(); } finally { lock.unlock(); } } /** * @Description:特别注意:不能将主线程和子线程循环50次的调用写在一个for循环里, * 因为这样会导致后面的跑到前面去,引发错序打印问题 * @param args * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { TraditionThreadLockTest test = new TraditionThreadLockTest(); ExecutorService threadPool = Executors.newFixedThreadPool(4); threadPool.submit(() -> { try { for(int i = 1; i <= 50; i++) { test.subTask(i); } } catch (Exception e) { e.printStackTrace(); } }, "subThread"); threadPool.submit(() -> { try { for(int i = 1; i <= 50; i++) { test.mainTask(i); } } catch (Exception e) { e.printStackTrace(); } }, "mainThread"); threadPool.shutdown(); }}上述内容就是如何实现一个多线程,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。
线程
循环
传统
程序
测试
任务
内容
技能
知识
运行
简明
简明扼要
就是
文章
方法
更多
篇文章
行业
资讯
资讯频道
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
科室会图片数据库
服务器风扇8pin接口图解
黄浦区市场软件开发信息中心
网络安全黑板报图片甘肃
gis常见空间数据库技术
豫教思语网络安全知识答案
华为软件开发支出
我的世界一进来就送合金的服务器
计算机软件开发的简历
梦幻西游新服务器人数
未转变者服务器突然黑屏怎么回事
宏景数据库密码
石家庄星捷软件开发有限公司
天坛医院脑卒中数据库
网络安全方面需求
长春网络安全学习攻防技术
惠普服务器加装gpu
计算机网络技术竞争力大吗
最有前景的软件开发类股票
mssql数据库 万网
深圳软件开发科技公司
在一个单元格里提取数据库
上传图片到php服务器
选择服务器输入6位安全码
华为软件开发支出
罗布乐思要服务器吗
无状态数据库设计
动画特效软件开发
左岸网络安全
mssql数据库 万网