并发编程(一)

用并发解决的问题大体上可以分为“速度”和“设计可管理性”两种。

在run()中对静态方法Thread.yield()的调用是对线程调度器(java线程机制的一部分,可以将CPU从一个线程转移给另一个线程)的一种建议,它在声明:我已经执行完生命周期中最重要的部分了,此刻正是切换给其他任务执行一段时间的大好时机。ps:其实就是我停会,让别的线程运行会。

将Runnable对象转化为工作任务的传统方式是把它提交给一个Thread构造器,下面是例子:
Thread t = new Thread(new LiftOff());
t.start();

Thread构造器只需要一个Runnable对象。调用Thread对象的start()方法为该线程执行必须的初始化操作,然后调用Runnable的run()方法,以便在这个新线程中启动该任务。

使用Executor

Executor允许你管理异步任务的执行。我们可以使用Executor来代替上面的Thread对象。LiftOff对象知道如何运行具体的任务,与命令模式一样,它暴露了要执行的单一方法。
ExecutorService exec = Executors.newCachedThreadPool();
for(int i = 0; i < 5; i++)
exec.execute(new LiftOff());
exec.shutdown();

非常常见的情况是,单个的Executor被用来创建和管理系统中所有任务。

对shutdown()方法的调用可以防止新任务被提交给这个Executor,当前线程将继续运行在shutdown被调用之前提交的所有任务。这个程序将在Executor中的所有任务完成之后尽快推出。

你可以很容易地将前面示例中的CachedThreadPool替换为不同类型的Executor。FixedThreadPool使用了有限的线程集来执行所提交的任务:
ExecutorService exec = Executors.newFixedThreadPool(5);
for(int i = 0; i < 5; i++)
exec.execute(new LiftOff());
exec.shutdown();

从任务中产生返回值

Runnable是执行工作的独立任务,但是它不返回任何值。如果你希望任务在完成时能够返回一个值,那么可以实现Callable接口而不是Runnable接口。在java se5中引入的Callable是一种具有类型参数的泛型,它的类型参数表示的是从方法call(),中返回值,并且必须使用ExecutorService.submit()方法调用它:
class TaskWithResult implements Callable<String> {
private int id;
public TaskWithResult(int id) {
this.id = id;
}
public String call() {
return "result of TaskWithResult " + id;
}
}
public class CallableDemo {
public static void main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPool();
ArrayList<Future<String>> results =
new ArrayList<Future<String>>();
for(int i = 0; i < 10; i++)
results.add(exec.submit(new TaskWithResult(i)));
for(Future<String> fs : results)
try {
// get() blocks until completion:
System.out.println(fs.get());
} catch(InterruptedException e) {
System.out.println(e);
return;
} catch(ExecutionException e) {
System.out.println(e);
} finally {
exec.shutdown();
} }
}

submit()方法会长生Future对象,它用Callable返回结果的特定类型进行了参数化。你可以使用isDone()方法来查询Future是否已经完成。

你可以使用Thread.currentThread()来获取当前该任务的Thread对象。

[color=red]注意优先级是在run()的开头部分设定的,在构造器中设置它们不会有任何好处,因为Executor在此刻还没有开始执行任务。[/color]

虽然JDK有10个优先级,但是它与多数操作系统都不能映射得很好。唯一可一直的方法是当调整优先级的时候,只使用MAX_PRIORITY NORM_PRIORITY和MIN_PRIORITY

对于任何重要的控制或在调整应用时,都不能依赖与yield()。实际上,yield()经常被误用。

所谓后台线程,是指在程序运行的时候在后台提供一种通用服务的线程,并且这种线程并不属于程序中不可或缺的部分。因此,当所有的非后台线程结束时,程序也就终止了,同时会杀死进程中的所有后台线程。
for(int i = 0; i < 10; i++) {
Thread daemon = new Thread(new SimpleDaemons());
daemon.setDaemon(true); // Must call before start()
daemon.start();
}

必须在线程启动之前调用setDaemon()方法,才能把它设置为后台线程。

Daemon线程被设置成了后台模式,然后派生出许多子线程,这些线程并没有被显示地设置为后台模式,不过它们的确是后台线程。接着,Daemon线程进入了无限循环,并在循环里调用了yield()方法把控制权交给其他进程。

你应该意识到后台进程在不执行finally子句的情况下就会终止其run()方法。

当最后一个非后台线程终止时,后台线程会突然终止。

Runnable接口的名字选择很糟糕,所以我认为Task应该是好得多的名字。

加入一个线程

一个线程可以在其他线程之上调用join()方法,其效果是等待一段时间直到第二个线程结束才继续执行。如果某个线程在另一个线程t上调用t.join(),此线程将被挂起,直到目标线程t结束才恢复(即t.isAlive() == false)

也可以在调用join()时带上一个超时参数。

import static net.mindview.util.Print.*;
class Sleeper extends Thread {
private int duration;
public Sleeper(String name, int sleepTime) {
super(name);
duration = sleepTime;
start();
}
public void run() {
try {
sleep(duration);
} catch(InterruptedException e) {
print(getName() + " was interrupted. " +
"isInterrupted(): " + isInterrupted());
return;
}
print(getName() + " has awakened");
}
}
class Joiner extends Thread {
private Sleeper sleeper;
public Joiner(String name, Sleeper sleeper) {
super(name);
this.sleeper = sleeper;
start();
}
public void run() {
try {
sleeper.join();
} catch(InterruptedException e) {
print("Interrupted");
}
print(getName() + " join completed");
}
}
public class Joining {
public static void main(String[] args) {
Sleeper
sleepy = new Sleeper("Sleepy", 1500),
grumpy = new Sleeper("Grumpy", 1500);
Joiner
dopey = new Joiner("Dopey", sleepy),
doc = new Joiner("Doc", grumpy);
grumpy.interrupt();
}
} /* Output:
Grumpy was interrupted. isInterrupted(): false
Doc join completed
Sleepy has awakened
Dopey join completed


joiner线程将通过在Sleeper对象上调用join()方法来等待Sleeper醒来。在main()里面,每个Sleeper都有一个Joiner,这可以在输出中发现,如果Sleeper被中断或者是正常结束,Joiner将和Sleeper一同结束。

注意,Java SE5的java.util.concurrent类库包含诸如CyclicBarrier这样的工具,它们可能比最初的线程类库中的join()更加合适。

继续错误的代价由别人来承担,而承认错误的代价由自己来承担。

所有对象都自动含有单一的锁,当在对象上调用其任意synchronized方法的时候,此对象都被加锁,这时候对象上的其他synchronized方法只有等到前一个方法调用完毕并释放了锁之后才能被调用。其所有synchronized方法共享同一个锁。
TwinCAT报SSE invalid operation错误 错误类型 TwinCAT程序中报出以下错误: 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 **** 383 ms | 'Port_851' (851): Exception (Exception Code: 0xc0000090, SSE invalid operation) in PLC Application Untitled1 Instance, Task PlcTask (RBP: 0xffffb3016c80ecc0, RIP: 0xffffe708ee5b5f53, RSP: 阅读详情

相关推荐

从零到一:构建嵌入式Nginx的模块化架构与跨平台部署实战

本文详细介绍了在ARM32架构的RV1126嵌入式设备上,通过交叉编译技术构建模块化Nginx服务器的完整实战流程。涵盖环境配置、依赖库编译、Nginx核心与http_ssl_module等模块集成、性能优化及部署调试,为嵌入式开发提供高效可靠的Web服务器解决方案。

rock5的博客 202

一张图看懂Java并发编程

一张图看懂Java并发编程

Leo打怪兽的博客 239

别再用MounRiver了!在VSCode里用PlatformIO搞定CH32V208开发(附完整配置流程)

本文详细介绍了如何在VSCode中使用PlatformIO进行CH32V208开发,替代传统的MounRiver Studio。通过完整的配置流程和优化技巧,开发者可以构建高效、现代化的RISC-V开发环境,显著提升编译速度和开发效率。

weixin_28711397的博客 534

Java并发编程的艺术(一)

简介 在暑期实习的过程遇到了大厂基本上都绕不开并发编程的问题,可以说并发编程是任何编程语言绝对重头的部分,不论是为了以后的面试还是自我的提升,学习并发编程都是必须的。希望通过本次的学习可以掌握: 1. Java并发的机制; 2. JVM中是如何支持并发的; 3. 学会并发编程的基础语法; 4. 加深对常用的关键字的理解; 5. 掌握一定的并发编程的技巧; 阅读书籍 《Java并发编程艺术》 阅读前推荐: 对Java编程基础和面向对象设计熟悉; 对操作系统比较熟悉(线程相关概念); JVM了解一点。 正文

yindarui 321

RC滤波电路工作原理:【带图+公式计算】

容抗Xc和电容C成反比,和频率f也成反比,C越大,交流电容易通过电容,说明电容量大,电容的阻碍作用小;交流电的频率高,交流电也容易通过电容,说明频率高,电容的阻碍作用也小。我们可以看到,一个2V的纹波,经常RC电路后,幅值下降到mv级别,基本可以忽略不计,这就是RC滤波电路的工作原理。一个频率为1Khz的信号,通过一个容值为0.1uf的电容,计算电容对该信号产生的阻抗。将RC滤波器电路中的电阻,取值为1KΩ,电容取值为0.47uf,纹波幅值为2V。从公式1可以看到,Xc越大,Vout值就越接近Vin的值。

weixin_66299220的博客 2万+

光模块数字诊断监控(DDM)功能

DDM(Digital Diagnostic Monitoring)数字诊断监控,由行业组织SFF Committee制定,遵循SFF-8472多源协议定义的标准参数而工作,规范了光模块和网络设备的软硬件所需遵循的标准数值或范围,确保了网络设备供应商和光模块供应商之间所提供产品的互操作性不同。:通过监测激光器的偏置电流来预测激光器的劣化,从而确保在故障发生之前将业务切换到备用链路上或替换有可能故障的光模块,因此起到了预测光模块寿命的作用。光模块DDM信息可以通过SNMP读取光模块的接收光功率和发射光功率。.

光模块的博客 2300

并发编程一

什么是进程?进程是指运行中的程序。 比如我们使用钉钉,浏览器,需要启动这个程序,操作系统会给这个程序分配一定的资源(占用内存资源)。什么线程?线程是CPU调度的基本单位,每个线程执行的都是某一个进程的代码的某个片段。举个栗子:房子与人比如现在有一个100平的房子,这个方式可以看做是一个进程房子里有人,人就可以看做成一个线程。人在房子中做一个事情,比如吃饭,学习,睡觉。这个就好像线程在执行某个功能的代码。所谓进程就是线程的容器,需要线程利用进程中的一些资源,处理一个代码、指令。最终实现进程锁预期的结果。进程和

llg3189609554的博客 976

【存算一体架构实战】四、突破编译壁垒:手把手实现AI模型到存算硬件的自动映射

摘要:存算一体硬件的性能优势难以充分释放,核心瓶颈在于传统编译器无法高效适配"计算-存储融合"的新型架构。本文系统剖析传统编译流程在存算硬件上的三大痛点:数据布局不匹配导致90%带宽浪费、算子映射效率低使硬件利用率不足30%、缺乏专用优化_pass导致延迟居高不下。通过构建MLIR-PIM编译框架,实现从AI模型到存算硬件的全自动化映射,核心流程包括:TensorFlow模型→MLIR Dialect转换→存算优化_pass→硬件指令生成。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 242

【并发编程一:走进并发编程】

java并发编程学习

weixin_43333483的博客 1436

5套高颜值AI漫剧女主设定图!直接拿去做漫剧(附完整提示词)

左侧特写放大表现暖棕眼妆、豆沙唇、红宝石首饰、发丝与针织纹理,四个视图严格保持同一人物脸模、发色、服装、首饰和身体比例,柔和复古棚拍光,低饱和酒红与奶油色配色,真实布料、皮革、金属与宝石材质,高级精致角色资产设定图,高清8K。佩戴珍珠与透明水晶耳坠、纤细珍珠项链;左侧特写放大至胸部以上,清晰表现皮肤、眼妆、发丝、耳饰和针织材质,人物四个视图保持同一脸模、发型、服装、饰品和身体比例,柔和棚拍漫射光,轻微地面阴影,高级细腻材质,真实发丝,细腻皮肤,高精度角色资产设定图,高清8K质感。

欢迎来到鸾姝淡月博客,专为程序员和编程爱好者打造的技术博客。我们分享编程语言趋势、开发工具、编程哲学、职业发展等,助你掌握新技术,优化技能,激发编程热情。 1705

DC/DC开关电源学习笔记(十三)Buck-Boost升降压电路工作原理

Buck-Boost电路是一种能够实现输出电压高于或低于输入电压的DC-DC变换器,且输出电压极性与输入电压相反。它结合了Buck(降压)和Boost(升压)两种拓扑的特点,广泛应用于需要灵活电压调整的场合,如电池供电设备、LED驱动和工业控制系统。本文将从电路结构、工作原理、关键公式推导及实际应用等方面进行详细分析。

小幽余生不加糖 3505

并发编程(一)

一、并发编程与高并发 并发编程与高并发是两个不同的概念,并发编程是相对于以往单线程的编程模型,而采用多线程的编程模型,以充分利用CPU资源。高并发是一类场景,应用的并发请求量非常大的情景,为了解决高并发场景的问题,有很多技术手段,其中多线程并发编程模型是一种技术手段,还有包括扩容、缓存、队列、拆分、服务降级与熔断、数据库分库分表等等。 并发的概念:同时拥有两个或更多的线程,如果是单核CPU,则...

E_N_T_J的博客 2523

Vue Vben Admin 登录页修改全攻略:从登录界面定制到接口对接全流程配置

方式一:修改国际化文件找到对应的语言包文件,修改和的值。方式二:直接传递文本page-description="现代化的后台管理系统模板"page-title="欢迎使用 Vue Vben Admin"从上面的代码可以看出,登录表单使用了的方式来定义表单字段,这种方式提供了极大的灵活性。如果你想要自定义表单,可以修改formSchema数组。如果你的登录需求非常特殊,现有的组件无法满足,你可以完全自定义表单。只需在login.vue中替换<template><h2>自定义登录</h2>

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 479

【Java并发编程 一】并发编程的挑战

本文是Java并发编程系列的第一篇,在正式进行Java中的并发编程方式之前,我们先来了解下什么是并发编程。并发编程的优势是什么,又有什么挑战和问题,以及该如何解决?那么首先要搞清楚什么是并发的概念? 并发的基本概念 并发是指两个或多个事件在同一时间间隔内发生,在多道程序环境下,一段时间内宏观上有多个程序在同时执行,而在同一时刻,单处理器环境下实际上只有一个程序在执行,故微观上这些程序还是在分时的交替进行。操作系统的并发是通过分时得以实现的,和串行以及并行的概念区别: 串行:顺序做不同事的能力:先洗衣服,

MaoLin Tian's Blog 525

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

一、并发编程的挑战

并发编程的挑战 一、上下文切换 1.1 代码实现多线程与单线程的差异 public class ConcurrencyTest { private static final long count = 10000l; public static void main(String[] args) throws InterruptedException { concurrency(); serial();

h_big_tiger的博客 309

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

《JAVA并发编程实践》读书笔记(一)

《JAVA并发编程实践》读书笔记(一)2016年8月1日,“妮妲”冲击广东,全市放假1天。托“妮妲”的福,终于有空将近期的阅读整理一下。 最近利用业余时间重读了Brian Goetz的书,觉得受益匪浅。以前一知半解的概念和用法都在这次阅读中得到了答案。1.并发简史 并发随操作系统的发展而发展起来,操作系统为各个独立执行的进程分配各种资源,包括内存、文件句柄以及安全证书等,不同的进程间可以通过一些

黑暗骑士 2793

并发编程专栏一

并发编程专栏1、Synchronized用过吗,其原理是什么? 2、你刚才提到获取对象的锁,这个“锁”到底是什么?如何确定对象的锁? 3、什么是可重入性,为什么说Synchronized是可重入锁? 4、JVM对Java的原生锁做了哪些优化? 5、为什么说Synchronized是非公平锁? 6、什么是锁消除和锁粗化? 7、为什么说Synchronized是-个悲观锁?乐观锁的实现原理又是什么?什么是CAS,它有什么特性? 8、乐观锁一定就是好的吗?

涛子丶白了你一眼的博客 5305

【并发编程】并发编程的基础一

一、Object 的wait()和notify() 方法 下图为线程状态的图 Object 对象中的 wait()和notify()是用来实现等待 / 通知模式,等待状态和阻塞状态是不同的,等待状态的线程可以通过notify() 方法唤醒并继续执行,而阻塞状态的线程则是等待获取新的锁。 调用 wait()方法后,当前线程会进入等待状态,直到其他线程调用notify()或notifyAll() 来唤醒。 调用 ...

天天新知 452

并发编程概念整理一

目录为什么要并发编程并发编程带来的问题安全性问题原子性问题可见性问题有序性问题活跃性问题死锁活锁饥饿性能问题线程生命周期管程synchronizedvoliatefinal 为什么要并发编程 最主要还是压榨硬件(上图为我cpu的使用率)。现在硬件都是过剩的状态,不压榨干嘛,也不能天天指望程序员拿头发来优化算法啊。 并发编程带来的问题 安全性问题 都知道并发编程能提高效率,但是这肯定有代价的,会带来很多问题主要分为3大类。 原子性问题 原子性:一个或多个操作在cpu执行过程中不可分割。不可分割也就是.

Nortyr的博客 1440

Java并发编程(一)

​ 并发编程的目的是为了使得程序运行的更快,但是并不是启动更多的线程就能让程序最大程度的并发执行。在进行并发编程时,需要考虑上下文切换、死锁的问题,以及受限于硬件和软件资源限制的问题。 上下文切换: 执行多线程代码时,cpu通过给每个线程分配CPU时间片来实现。时间片是CPU分配给各个线程的时间,时间片非常短,cpu通过不停切换线程执行,来达到多线程执行。上下文切换,会影响多线程的执...

菜鸟 182

并发编程笔记一

并发编程 @Author 雷奇 一、线程的基础概念 一、基础概念 1.1 进程与线程A 什么是进程? 进程是指运行中的程序。 比如我们使用钉钉,浏览器,需要启动这个程序,操作系统会给这个程序分配一定的资源(占用内存资源)。 什么线程? 线程是CPU调度的基本单位,每个线程执行的都是某一个进程的代码的某个片段。 举个栗子:房子与人 比如现在有一个100平的房子,这个方式可以看做是一个进程 房子里有人,人就可以看做成一个线程。 人在房子中做一个事情,比如吃饭,学习,睡觉。这个就好像线程在执行某个功能的代码。

摆渡吃猫的鱼的博客 528

一课掌握Java并发编程精髓

│ ├── [ 78M] 4-10 (共享锁独占锁)如何根据读操作和写操作拆分锁粒度-读写锁ReadWriteLock?│ ├── [ 23M] 5-6 并发安全的List - CopyOnWriteArrayList原理与使用场景分析。│ ├── [ 34M] 2-3 首先了解程序是如何运行的?│ ├── [ 51M] 4-8 (读写锁)读写锁ReadWriteLock何时使用锁的降级?│ ├── [ 77M] 4-9 (读写锁)读写锁ReadWriteLock何时使用锁的降级?

2301_81262884的博客 435

并发编程(一)python并发编程简介

文章目录1. 为什么要引入并发编程2. 有哪些程序提速的方法3. python对并发编程的支持 1. 为什么要引入并发编程 场景一:网络爬虫、一个小时的任务并发20分钟完成。 场景二:APP应用,正常打开需要3秒,采用异步并发加载后提升到200毫秒 所以说,并发编程是为了提升程序运行的速度。 2. 有哪些程序提速的方法 多线程并发(threading) 多CPU并行(multiprocessing) 多机器并行(Hadoop、hive、spark) 3. python对并发编程的支持 多线程:th

qq_42546127的博客 610

一、并发编程入门

并发编程入门 @author lisiwen @createTime 2020/07/22 1.上下文切换 ​ 单核处理器也是支持多线程执行代码,因为cpu通过给每个线程分配cpu时间片来实现这个机制,时间片是cpu分配给各个线程的时间,因为时间片特别短,所以cpu通过不停切换线程执行,让我们感觉很多线程是同时执行的,时间片一般是十几毫秒(ms)。 ​ CPU通过时间片分配算法循环执行任务,当前任务执行一个时间片后会却换到写一个任务,但是,在切换之前会保存上一个任务的状态,以便下一次切换回这个任务时

无忧少年的博客 197

Swift 并发编程一

????????关注后回复“进群”,拉你进程序员交流群????????这里是Swift并发编程系列第一篇(共四篇)。包含以下内容:为什么需要并发编程并发于并行的区别GCD中的队列与函数预防死锁DispatchWorkItem为什么需要并发假设您在主线程上并且需要来自服务器的数据。您从服务器请求数据并等待,直到您从服务器获得响应。在此期间,您的主线程不会执行任何与 UI 相关的工作,这会使您的...

iOS_开发 351

一张图看明白并发编程!对,就一张图

Java并发编程是Java编程中比较高阶的部分,曾听一位java界的大佬说过:“开发正确的程序是比较难的,开发正确的高并发多线程应用则更是难上加难”。所以,但凡有点追求的程序员,都会在并发...

田维常 3396
上一篇: Linux定时任务系统Cron入门
下一篇: 文章整理
gedoua
博客等级 码龄18年 0粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值