并发编程(一)

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

在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方法共享同一个锁。
微信小程序 - 解决video视频播放黑屏只有声音没有画面问题,使用Video标签无法播放视频失败只有声音、黑屏视频播放不了,安卓手机/苹果ios视频只有声音却没有画面(uniapp微信小程序也适用) 微信小程序video有声音但是画面黑屏,uni-app微信小程序视频播放黑屏但是有音频,微信小程序video android真机或苹果ios系统中黑屏 只有声音没有画面,Uniapp微信小程序 Video MP4视频播放失败,只有声音,黑屏,视频播放不了,解决办法,解决小程序视频编码兼容性问题导致黑屏,出现黑屏但有声音的问题,video标签播放视频有声音,但是黑屏的原因及解决办法,mp4视频编码的问题,video标签播放视频有声音,但是黑屏。uniapp使用video标签无法播放视频出现黑屏问题处理,如何解 阅读详情

相关推荐

数字后端零基础入门系列 | Innovus零基础LAB学习Day7

数字后端零基础入门系列 | Innovus零基础LAB学习Day7

weixin_37584728的博客 2273

一张图看懂Java并发编程

一张图看懂Java并发编程

Leo打怪兽的博客 239

Tinder养号防封攻略来了:最新Tinder养号流程和运营攻略

今天,我就来给大家分享一下Tinder养号的具体操作,以及针对Tinder账号被封的一些常见问题为大家做个答疑。

m0_67768117的博客 2万+

Java并发编程的艺术(一)

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

yindarui 321

光致发光(Photoluminescence, PL)入门版

关于光致发光的实际应用做出一些解释。

sinat_40546227的博客 1万+

合宙ESP32C3实战:MPU6500六轴传感器数据读取与校准全解析

本文详细解析了如何使用合宙ESP32C3开发板读取和校准MPU6500六轴姿态传感器数据。从硬件接线、开发环境搭建到核心代码解析,提供了全面的实战指南,帮助开发者快速掌握传感器配置与数据处理技巧,适用于姿态控制、运动检测等应用场景。

weixin_27066963的博客 406

并发编程一

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

llg3189609554的博客 976

MSP430项目设计:2020年TI杯大学生电子设计竞赛 坡道行驶电动小车(C题)循迹小车(分享项目展示视频与源码)

文章目录题目要求一、硬件设计二、理论分析与计算三、电路与程序设计四、测试方案与测试结果五、项目展示 哔哩哔哩项目展示视频:https://www.bilibili.com/video/BV1oz4y1d7mH/ 百度网盘资料链接:https://pan.baidu.com/s/1PC-lkSORH_XCgIG-u3HCog 提取码:c7zz 取走记得点赞啊! 题目要求 1.任务 利用TI的MSP430/MSP432平台,设计制作一个四轮电动小车。要求小车能沿着指定路线在坡道上自动循迹骑线行驶。小车必须独立

mbs706的博客 4万+

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

java并发编程学习

weixin_43333483的博客 1436

单点DToF激光测距传感器各家产品的比较

汇总DToF 单点测距传感器的相关信息

Linux 设备驱动概述及开发环境构建 (一) 1774

AI上推荐 之 协同过滤

㐇

Miracle8070 1万+

并发编程(一)

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

E_N_T_J的博客 2523

发那科 Fanuc PLC 报文通讯,报文解析。附源程序

发那科 Fanuc PLC 报文通讯,最详细的发那科 PLC报文解析,不再局限在官方提供的库,也不用再局限在windows平台。

ITOfDragon的博客 1747

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

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

MaoLin Tian's Blog 525

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

一、并发编程的挑战

并发编程的挑战 一、上下文切换 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

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

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

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

黑暗骑士 2793

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

并发编程专栏一

并发编程专栏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、付费专栏及课程。

余额充值