以前你编写的Java程序同时能做几件事情?有几个执行流程?main方法执行完,整个程序一定会退出吗?

  • 最多只能做一件事
  • 函数按着顺序执行,函数内按着语句执行。可以有多个可以有一个。
  • 不一定。因为Main方法执行完之后,也许有线程未关闭,所以JVM肯定不会退出。如果在main加入System.exit(0)则会强制退出。

早期的电脑一般是单核CPU,但那时我们就可以在编写程序的同时听歌,你觉得其CPU可以同时执行两个程序的指令吗?如果不能,为什么我们可以边写程序边听歌?

  • 不可以。单核只能同时处理一个。
  • 因为计算机虽然指令多,但是cpu运算速度更快,让我们觉得在同时运行两个程序,实际上两个程序指令是来回执行的。

打开“资源监视器”观察你使用的QQ、浏览器或者WPS,一般有几个线程?思考一下,当你运行这些程序的时候,有哪些现象证明了这些程序使用了多个线程?

这里以微软edge为例子



以我个人理解,出现多个程序的原因有以下

  • 我安装的edge扩展

  • 我打开的网页(可能每一个没有关闭的网页都是一个线程)

  • edge的更新检测服务
  • edge的账号服务(同步自己的浏览历史等)

比如我在浏览bilibili的时候,我首先使用油猴开启了免会员,其次再由adground帮我免除广告,点击视频,不仅有视频输出还有声音输出(举例bilibili是因为bilibili为了省劲现在用的是硬件加速,也就是说它是占用cpu资源的)。单是访问这个网站看视频就已经有五个线程了。

运行“Bounce”与"BounceThread"两个程序。当你多次点击Start时,两个程序运行起来有何不同?为什么?

  • 直观上来看,BounceThread按一次start就会出现一个球,而Bounce只能出现一个球(上一个球停止运动start点击才有效)。
  • BounceThread使用了多线程操作。(这点有待补充)

思考:两个人只有一双筷子(用A、B分别表示这双筷子的两只),这两个人只有各自获A、B这两只筷子的候才能成功吃饭。可以想象,他们会产生冲突。尝试说明他们可能产生哪些冲突?怎么解决这些冲突?

AB可能产生的冲突(俩人用甲和乙代替):

  • 甲拿A,乙拿B,俩人都不能吃饭(或者互换)。
  • 甲先拿到AB,乙空手。但是乙有吃饭的需求,他只能用眼睛(监听器)观察甲,放下筷子才拿起AB吃饭。(或者互换)
  • 甲和乙同时需要吃饭,同时需要AB两双筷子,但是俩人之间没有优先级(比如甲要让着乙),产生了竞争,他俩一个都吃不上饭。

解决办法:

  • ①设立俩人绝对优先级,优先级高的那个人有需要必须先处理,无论乙是不是正在用还是需要用,一切以甲为准。
  • ②设立一个相对优先级,比如同时需要吃饭,先让甲吃完,乙再吃。如果乙在吃的时候甲需要吃,则甲需要等待乙使用完毕,再吃。
  • ③最简单的就是,再拿一双筷子,从硬件上解决问题(多核处理器)。
  • ④最粗暴的就是,杀掉乙(结束进程),让甲自己独占筷子,从根源解决问题。

第12周 预习、实验与作业:Java并发编程的更多相关文章

  1. 20145212 实验五《Java网络编程》

    20145212 实验五<Java网络编程> 一.实验内容 1.运行下载的TCP代码,结对进行,一人服务器,一人客户端: 2.利用加解密代码包,编译运行代码,一人加密,一人解密: 3.集成 ...

  2. 20145210实验五《Java网络编程》

    20145210实验五<Java网络编程> 实验内容 1.运行下载的TCP代码,结对进行,一人服务器,一人客户端: 2.利用加解密代码包,编译运行代码,一人加密,一人解密: 3.集成代码, ...

  3. 20145237 实验五《Java网络编程》

    20145237 实验五<Java网络编程> 一.实验内容 •1.运行下载的TCP代码,结对进行,一人服务器,一人客户端: •2.利用加解密代码包,编译运行代码,一人加密,一人解密: •3 ...

  4. 12、Java并发编程:阻塞队列

    Java并发编程:阻塞队列 在前面几篇文章中,我们讨论了同步容器(Hashtable.Vector),也讨论了并发容器(ConcurrentHashMap.CopyOnWriteArrayList), ...

  5. 20145312 实验五 《Java网络编程》

    20145312 实验五<Java网络编程> 一. 实验内容及要求 实验内容: 运行下载的TCP代码,结对进行,一人服务器,一人客户端: 利用加解密代码包,编译运行代码,一人加密,一人解密 ...

  6. 20145312 实验五《Java网络编程》

    20145312 实验五<Java网络编程> 一. 实验内容及要求 实验内容: 运行下载的TCP代码,结对进行,一人服务器,一人客户端: 利用加解密代码包,编译运行代码,一人加密,一人解密 ...

  7. Java并发编程面试题 Top 50 整理版

    本文在 Java线程面试题 Top 50的基础上,对部分答案进行进行了整理和补充,问题答案主要来自<Java编程思想(第四版)>,<Java并发编程实战>和一些优秀的博客,当然 ...

  8. Java并发编程的艺术,解读并发编程的优缺点

    并发编程的优缺点 使用并发的原因 多核的CPU的背景下,催生了并发编程的趋势,通过并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升. 在特殊的业务场景下先天的就适合于并发编程. 比如在 ...

  9. Java并发编程:volatile关键字解析

    Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在 ...

  10. Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

随机推荐

  1. .net 定时任务(调度 .net quartz) demo

    详细解说:https://blog.csdn.net/noaman_wgs/article/details/80984873 demo如下: 新建控制台应用程式: 添加Nuget包 static vo ...

  2. CKeditor页面公式不显示

    <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax. ...

  3. Net Core 网关 Ocelot 简单案例

    1.什么是Ocelot Ocelot是一个用.NET Core实现并且开源的API网关,它功能强大,包括了:路由.请求聚合.服务发现.认证.鉴权.限流熔断.并内置了负载均衡器与Service Fabr ...

  4. 对服务器进行心跳检测 python django

    (由于春节期间连不上服务器,但又不知道是不是服务器关机了,因此写一个心跳检测功能遇到问题时可以排查部分原因) 具体来说分为客户端和服务端,客户端为校园服务器,服务端为我们自己搭建的http服务器.客户 ...

  5. HTML初步了解

    W3C:万维网联盟,是国际化最著名的标准化组织. HTML:(Hyper Text Markup Language )超文本标记语言,网页编程语言,用于定义文档的内容和结构. CSS:(Cascadi ...

  6. Neo4j安装及简单使用【转】

    转载防丢失. 一.Neo4j和图数据库简介 neo4j是基于Java语言编写图形数据库.图是一组节点和连接这些节点的关系.图形数据库也被称为图形数据库管理系统或GDBMS. Neo4j的是一种流行的图 ...

  7. js 页面小数相加精度问题

    解决方法:把需要计算的数字升级(乘以10的n次幂)成计算机能够精确识别的整数,等计算完毕再降级(除以10的n次幂),这是大部分编程语言处理精度差异的通用方法. 比如计算0.33和5.2的和,则需要把( ...

  8. linux安装datax +datax-web踩坑总结

    一丶安装datax 环境:JDK8+     py2.7+ 下载地址:http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz ...

  9. Go语言中超过1000个线程panic

    1.问题描述 2.实验 3.原理 4.解释 Close太多,Close在Windows上阻塞型的可能会新创建线程,而Linux上是非阻塞型不会新创建线程.

  10. Dapper、EF、WebAPI转载记录

    轻量级框架Dapper基础 https://www.cnblogs.com/Sinte-Beuve/p/4231053.html   基本使用 https://www.cnblogs.com/hxzb ...