package demo;
import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.CountDownLatch;
public class ThreadOrder {
static class TaskProcess implements Runnable {
private Queue<Runnable> tasks;//获取任务的队列
private Object myLock;//本线程等待的锁
private Object nextLock;//通知下个线程的锁
private CountDownLatch latch;//通知主线程:本线程已经就绪
public TaskProcess(Queue<Runnable> tasks, Object myLock, Object nextLock, CountDownLatch latch) {
this.tasks = tasks;
this.myLock = myLock;
this.nextLock = nextLock;
this.latch = latch;
}
public void run() {
String name = Thread.currentThread().getName();//当前线程的名字
synchronized (myLock) { //拿到自己的锁后
latch.countDown();//拿到自己的锁后,通知主线程:本线程已经就绪
Runnable task;//要执行的任务
while (true) {
// 1.等待被通知执行
try {
myLock.wait();
} catch (InterruptedException e) {
System.out.println("运行异常:" + name);
notifyNextThread();//必需 通知下个线程,以防止下一个线程永久等待
return;
}
// 2.被通知后,开始获取任务并执行
task = tasks.poll();
if (task == null) {//没有任务
System.out.println("没有任务,线程退出:" + name);
notifyNextThread();//必需 通知下个线程,以防止下一个线程永久等待
return;
}
// 3.执行任务过程
task.run();
// 4.通知下一个线程执行任务
notifyNextThread();
}
}
}
private void notifyNextThread() {
synchronized (nextLock) {
nextLock.notify();
}
}
}
public static void main(String[] args) throws InterruptedException {
// 1. 定义任务队列
final Queue<Runnable> tasks = new LinkedList<Runnable>();
for (int i = 0; i < 100; i++) {
final int finalI = i;
tasks.offer(new Runnable() {
public void run() {
System.out.println(Thread.currentThread().getName() + " 执行任务:" + finalI);
}
});
}
// 2.定义执行任务的线程数(按次序执行)
// int number = 2;//TODO 修改这里可以 改变 执行任务的线程序列个数
int number = 10;//TODO 修改这里可以 改变 执行任务的线程序列个数
// 定义所有线程就绪通知机制
CountDownLatch latch = new CountDownLatch(number);
// 定义线程顺序执行用以交互的锁
Object[] locks = new Object[number];
for (int i = 0; i < number; i++) {
locks[i] = new Object();
}
for (int i = 0; i < number; i++) {
Object myLock = locks[i];
Object nextLock = locks[i < number - 1 ? i + 1 : 0];
Thread t = new Thread(new TaskProcess(tasks, myLock, nextLock, latch) {
}, "Thread-" + i);
t.start();
}
//等待所有线程就绪
latch.await();
//获取到第一个要执行的线程的锁,予以激活
Object firstLock = locks[0];
// 激活线程序列进行处理
synchronized (firstLock) {
firstLock.notify();// 激活线程序列进行处理
}
}
}
相关推荐
java实现的任务队列
NULL 博文链接:https://noddle0592.iteye.com/blog/2185620
java多线程实现任务组中的子任务按顺序执行
线程的调用是随机的,但是有个需求是在线程池中开辟多个线程按顺序去执行一组任务,比如说一个任务组下面有多个子任务,需要按子任务的顺序依次提交 代码: public class TestThread { public static void main(String[] args) { //创建线程池 ThreadPoolExecutor executorService = new ThreadPoolExecutor(10, 10, 0L
RV1126 MIPI CSI-2驱动RGB888图像采集的V4L2实战解析
本文详细解析了在RV1126平台上通过MIPI CSI-2接口采集RGB888格式图像的完整V4L2实战流程。核心内容包括设备树(DTS)配置、内核驱动适配、Media Controller链路调试,以及使用v4l2-ctl工具进行图像抓取与验证的方法,旨在帮助开发者打通从硬件连接到稳定采集RGB888图像数据的关键环节。
多线程顺序执行的几种写法
前言 这是一道常见面试题,我也碰到过,下面介绍的这几种写法也是对并发编程常用工具掌握程度的一个考察,是一道很好的面试题。一共有以下几种写法,下面来分别介绍。 join写法(两种写法) 线程池写法 wait、notify写法 Condition写法 CountDownLatch写法 CyclicBarrier写法 Thread.sleep写法 CompletableFuture写法 join写法 join()方法的作用,把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。 也就是说,
高德地图 搜索和点击定位
高德地图vue
深入解析report_timing:从基础参数到高级时序路径分析技巧
本文深入解析了静态时序分析(STA)中`report_timing`命令的核心用法与高级技巧。作为芯片设计的关键诊断工具,它能根据SDC约束精准定位时序路径问题。文章从基础参数过滤讲起,详细介绍了如何通过`-from`、`-through`、`-to`等选项定位关键路径,并深入讲解了`-input_pins`、`-nets`、`-transition_time`等高级选项如何揭示延迟细节,以及`-nworst`、`-slack_lesser_than`等过滤排序技巧,旨在帮助工程师高效解读时序报告,优化设计
多线程顺序运行的 4 种方法
举例:在线程thread2中,加上一句thread1.join(),其意义在于,当前线程2运行到此行代码时会进入阻塞状态,直到线程thread1执行完毕后,线程thread2才会继续运行,这就保证了线程thread1与线程thread2的运行顺序。// 下面三行代码顺序可随意调整,程序运行结果不受影响,因为我们在子线程中通过“join()方法”已经指定了运行顺序。简单说一下子线程与主线程的区别,子线程指的是发生在Thread内部的代码,主线程指的是发生在main函数中的代码。我们可以在main函数中通过。
飞凌OK3588-C Linux R4系统下MIPI YUV摄像头CSI尺寸错误排查与极性适配方案
本文详细介绍了在飞凌OK3588-C平台的Linux R4系统下调试MIPI YUV摄像头时遇到的'csi size err'错误排查与极性适配方案。通过分析信号极性、驱动参数调整及FPGA协同调试,提供了从硬件检测到系统级调试的完整解决方案,帮助开发者快速解决类似问题。
java多线程保证顺序执行
多线程保证顺序执行
ISP算法:自动白平衡(AWB)
1. 为什么要做白平衡? 人类视觉系统具有颜色恒常性特点,一次人类对物体观察不受光源影响。但是Sensor在不同光线下,物体呈现的颜色不同,在晴朗天空下会偏蓝,在烛光下会偏红。如图: 2.什么是自动白平衡? 为了消除光源对于图像传感器成像的影响,模拟人类视觉系统的颜色恒常性。保证在任何场景下看到的白色是真正的白色。 3. 如何做自动白平衡? 只要乘以一个对角矩阵,便可以进行白平衡...
MAX30102心率血氧传感器原理图设计,已量产(e-Health传感器)
在最近的便携健康监测设备项目中,我们采用了集成算法的 MAX30102 心率血氧模块 —— 这类带内置 MCU 算法的传感器能直接输出心率 / 血氧数值,大幅降低了主控资源占用。但硬件电路的稳定性直接决定了 PPG 信号的采集精度,下面结合实际项目里的原理图,拆解下这个模块的设计细节。
Java中控制多线程顺序执行
Java的线程调度策略是基于线程优先级的抢占式调度,同优先级的线程的执行顺序是看JVM心情的、不可预测的。那有什么办法来控制多线程按照开发者意愿的顺序执行呢?
24届数字IC设计/验证秋招总结贴——先看这个
为方便快速进行查找该专栏的内容,将所有内容链接均放在此篇博客中整理不易,欢迎订阅~~
[jS 事件循环理解] 主线程 宏任务 微任务 - 执行顺序优先级理解
最近看了一个帖子把js单线程中 , 主线程 | 宏任务 | 微任务 的调用顺序讲解的很直白精巧 , 记录一下以供查阅1.主线程, 可以理解为从上到下顺序执行的一个js线程2. 宏任务 script / setTimeOut /setInterval等3. 微任务主要有promise等4. 热知识: new Promise 也算主线程执行的顺序 我们可以这样理解1.主线程内顺序执行2.遇到 setTimeout等宏任务, 会把宏任务的回调代码放到宏任务队列中排队。
如何用 Claude Code 做大型项目重构与架构优化
本文介绍了如何利用Claude Code参与大型项目重构。文章指出,大型项目重构的最大难点在于理解系统结构和控制风险,而非单纯修改代码。作者提出了五步重构法:首先分析项目结构,其次梳理模块依赖关系,然后发现架构问题,接着设计分阶段重构方案,最后逐步实施。重点强调了Claude Code的核心价值在于帮助开发者理解复杂系统、分析模块依赖、发现结构问题、评估改动风险,而非仅作为代码生成工具。文章建议将Claude Code作为架构助手,通过分阶段小范围重构来降低风险,而非一次性全面重构。
迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)
迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)
js宏观任务、微观任务
困了 睡觉
IEM模型,地表粗糙度模拟
利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟
JS执行机制与事件循环
3、一旦执行栈中的所有同步任务执行完毕,系统就会按次序读取任务队列中的异步任务,于是被读取的异步任务,于是被读取的异步任务结束等待状态,进入执行栈,开始执行。在做一件事情的时候,因为这件事情会浪费很长时间,在做这件事的同时,你还可以去处理其他事情。由于主线程不断的重复获得任务、执行任务、再获取任务、再执行,所以这种机制被称为事件循环。前一个任务结束后再执行后一个任务,程序的执行顺序与任务的排列顺序是一致的、同步的。立即执行的任务,同步任务都是再主线程上执行的,形成一个执行栈。1、先执行执行栈中的同步任务;
深度学习工具包 DeepLearningToolbox
深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[](https://bitdeli.com/free "Bitdeli Badge")
怀旧版电脑GBC模拟器
再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。
Javascript同步与异步
Javascript同步与异步 JS是单线程 JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。这是因为Javascript这门脚本语言诞生的使命所致——JavaScript是为处理页面中用户的交互,以及操作DOM而诞生的。比如我们对某个DOM元素进行添加和删除操作,不能同时进行。应该先进行添加,之后再删除。 单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个务。这样所导致的问题是∶如果JS执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞的感觉。
关于Event Loop机制的解析
关于Event Loop机制的解析
WIN32多线程程序设计-读书笔记
持续更新~ 线程相比进程的优点是线程廉价,表现在:线程启动比较快,退出比较快,对系统资源的冲击比较小,而且,线程彼此分享了大部分核心对象的拥有权 从WIN32的角度看,进程含有内存(代码区、数据区、堆栈)和资源(对象、dll模块、线程,file handle) 多线程通信时需要把这个进程的handle明明白白的拷贝一份给另一个进程使用,而线程不需要,线程和handle生活在同一个进程之中 ...
cartographer 线程池+队列
C++简单线程池1.线程池1.1 线程池定义1.2 为何使用线程池1.3 线程池的工作原理1.5 工作者线程&I/O线程 1.线程池 1.1 线程池定义 简单来说就是有一堆已经创建好的线程(最大数目一定),初始化时他们都处于空闲状态,当有新的任务进来时,从线程池中取出一个空闲的线程处理任务,然后当任务处理完成之后,该线程被重新放回到线程池中,供其他的任务使用,当线程池中的线程都在处理任务...
线程池是如何重复利用空闲的线程来执行任务的?
作者:跑步_跑步blog.youkuaiyun.com/anhenzhufeng/article/details/88870374在Java开发中,经常需要创建线程去执行一些任务,实现起来也非常方便,...
JS执行队列
JS执行队列 JS 一大特点就是 单线程,即同一时间只能做一件事 单线程就意味着所有的任务需要排队,前一个任务结束后才会执行下一个任务。 这样可能造成的结果是:如果JS执行的时间过长,会导致页面的渲染不连贯,导致页面渲染加载阻塞的感觉 为了解决这个问题,JS出现了同步和异步 同步:前一个任务结束后才会执行下一个任务 异步:在处理一个任务的同时还可以执行其他任务 区别:在流水线上各个流程的执行顺序不同 console.log(1); window.setTimeout(function () { con
封装一个阻塞队列,轻松实现排队执行任务功能!
前言 个人觉得队列的使用在项目开发中挺多地方可以用到的,所以将如何封装一个队列的过程记录下来,总体来说难度并不大,但毕竟能力有限,如果各位有好的建议或意见欢迎提出来,如果本文能帮到你的话,记得点赞哦。 需求背景 在项目开发中,会经常遇到一些需要排队执行的功能,比如发动态时上传多张图片,需要一张一张的上传,比如直播间动画连需发送或者收到消息需要展示时,需要一个一个动画去展示等等场景,这时候会容易想到用队列去实现,但是我想不少小伙伴会直接弄一个 list,存着要执行的任务,然后通过递归的方式去遍历列表实现
JS 执行队列
JS 的一大特点就是单线程,也就是说,同一时间只能做一件事,这是因为 JS这门语言诞生的使命导致的—— JS 是为处理页面中用户的交互,以及操作 DOM 而诞生的。比如我们对某个 DOM 元素进行添加和删除操作,不能同时进行。应该先添加,然后再删除。 单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。这样所导致的问题是:如果JS执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞的感觉。 同步和异步 为了解决这个问题,利用多核 CPU 的计算能力,HTML5 提出
js执行队列
1.1 js是单线程 js语言的一大特点就是单线程,也就是说,同一时间只能做一件事,这是因为js 这门脚本语言诞生的使命导致–js是为处理页面中用户的交互,以及操作DOM而诞生的。 比如我们对某个DOM元素进行添加和删除操作,不能同时进行,应该先进行添加,之后再删除 1.2 同步和异步 为了解决这个问题,利用多核CPU的计算能力,HTML5提出Wep Worker标准,允许js脚本创建多个线程,于是js中出现了同步和异步 (1)同步 前一个任务结束后再执行后一个任务,程序的执行顺序与任务的排列顺序是一致的,
910



被折叠的 条评论
为什么被折叠?



