java核心技术-多线程之基本使用
多线程程序好处就是可以提高cpu使用率和系统的性能。这里举个例子,民以食为天,咱们以餐馆为例(后面基本上都用餐馆作为对象),后面如果没有特殊说明均采用本节相关术语,围绕餐馆我们可以抽象出如下几个角色以及线程映射:
No. | 角色 | 线程 | 属性 | 耗时(Unit:s) |
1 | 老板(管理) | 主线程 | 服务方 | - |
2 | 厨师(做菜) | 子线程 | 服务方 | 60 |
3 | 服务员(上菜) | 子线程 | 服务方 | 30(单趟) |
4 | 采购员(食材) | 子线程 | 服务方 | - |
5 | 食客 | 线程 | 请求方 | - |
下面咱们来下一个单线程(只有主线程)的例子,假设有2位食客,餐馆只提供一个番茄炒蛋,厨师完成番茄炒蛋的时间是60s,上菜的时间是30s,按照理论情况下,单线程情况下2位客人被服务的时间合计60s+2*30s+60s+30s = 210s,如果使用二个线程(厨师+服务员)时间就是2*60s = 120ms(因为厨师炒菜60s,然后服务员从上菜到下一个食客上菜耗时30s)。
public class Test {
public static void main(String[] args) {
doSingleThread();//单线程执行
doMultiThread();//多线程执行
} private static void doSingleThread() {
long t1 = System.currentTimeMillis() / 1000;
Chef.cook();
Waiter.go();
Waiter.back();
Chef.cook();
Waiter.go();
long t2 = System.currentTimeMillis() / 1000;
System.out.println("【单线程】为两位食客供餐完成,耗时:" + (t2 - t1) + "s.");
} private static void doMultiThread() {
long t1 = System.currentTimeMillis() / 1000;
Thread chefThread = new Thread(() -> {
Chef.cook();
Chef.cook();
}, "厨师");
Thread waiterThread = new Thread(() -> {
Waiter.go();
Waiter.back();
Waiter.go();
}, "服务员");
chefThread.start();
waiterThread.start();
try {
chefThread.join();
waiterThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
long t2 = System.currentTimeMillis() / 1000;
System.out.println("【多线程】为两位食客供餐完成,耗时:" + (t2 - t1) + "s.");
} private static class Chef {
public static void cook() {
try {
TimeUnit.SECONDS.sleep(60);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} private static class Waiter {
public static void go() {
try {
TimeUnit.SECONDS.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
} public static void back() {
try {
TimeUnit.SECONDS.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
} 打印的耗时结果:
【单线程】为两位食客供餐完成,耗时:210s.
【多线程】为两位食客供餐完成,耗时:120s.
通过以上程序实例,我们可以明白如下几个问题:
1. 什么情况下使用多线程?
我们都知道一个任务可以分多个步骤,如果一个任务的多个步骤可以独立出来执行并不会对执行结果产生影响,我们可以采用多线程。
2. 多线程能给我带来什么好处?
由于采用多线程可以减少cpu由于在单线程情况下由于任务某个步骤的阻塞或者等待导致的cpu的空闲,提高了cpu利用率,这样并发的执行,就会带来程序性能的提升。上面例子,
程序执行时间节省出来的就是服务员(原来厨师)在上菜过程中的耗时,我们可以看出如果采用多线程其实程序的耗时大部分(还有上下文切换耗时等)取决于耗时最长的那个步骤。
java核心技术-多线程之基本使用的更多相关文章
- java核心技术-多线程基础
进程.线程 进程(Process) 是程序的运行实例.例如,一个运行的 Eclipse 就是一个进程.进程是程序向操作系统申请资源(如内存空间和文件句柄)的基本单位.线程(Thread)是进程中可 ...
- java核心技术-多线程之引导概念
前两篇文章分别讲了,Java线程相关基础概念以及线程的内存模型,本节作为后续章节的引导,个人认为对于学习后面的只是还是比较重要.好了,既然说了多线程,那么首先要弄清以下几个问题: 1. 什么是多线程? ...
- java核心技术-多线程之线程内存模型
对于每一种编程语言,理解它的内存模型是理所当然的重要.下面我们从jvm的内存模型来体会下java(不限java语言,严格来讲是JVM内存模型,所有JVM体系的变成语言均适用)的内存模型. 堆: 就是我 ...
- java核心技术-多线程之线程基础
说起线程,无法免俗首先要弄清楚的三个概念就是:进程.线程.协程.OK,那什么是进程,什么是线程,哪协程又是啥东西.进程:进程可以简单的理解为运行在操作系统中的程序,程序时静态代码,进程是动态运行着的代 ...
- 读《java核心技术卷一》有感
过去一个多月了吧.才囫囵吞枣地把这书过了一遍.话说这书也够长的,一共706页.我从来不是个喜欢记录的人,一直以来看什么书都是看完了就扔一边去,可能有时候有那么一点想记录下来的冲动,但算算时间太紧,很多 ...
- java核心技术学习笔记之一程序设计概述
Java 核心技术之一程序设计概述 一. Java语言的特点 简单行 :取经于C++,排除了C++不常用的指针.结构等,增加垃圾回收. 面向对象:与C++不同是单继承,但是可以继承多接口.完全面向 ...
- 【Java】多线程初探
参考书籍:<Java核心技术 卷Ⅰ > Java的线程状态 从操作系统的角度看,线程有5种状态:创建, 就绪, 运行, 阻塞, 终止(结束).如下图所示 而Java定义的 ...
- java核心技术-(总结自杨晓峰-java核心技术36讲)
1. 谈谈你对java平台的理解 首先是java最显著的两个特性,一次写入处处运行:还有垃圾收集器gc,gc能够对java内存进行管理回收,程序员不需要关心内存的分配和回收问题 然后谈谈jre和jdk ...
- java的优点和误解 《java核心技术卷i》第一章
<java核心技术卷i>第一章主要内容包括三点: 1:Java白皮书的关键术语:描述Java的十一个关键字: 2:Java applet 3 :关于Java的常见误解 1:第一章:Ja ...
随机推荐
- OpenCV获取与设置像素点的值的几个方法
Title: OpenCV OpenCV像素值的获取与设置 Fn 1 : 使用 Mat 中对矩阵元素的地址定位的知识 (参考博文:OpenCV中对Mat里面depth,dims,channels,st ...
- MultiThread(VS2013 MFC多线程-含源码-含个人逐步实现文档)
原文:http://download.csdn.net/download/jobfind/9559162 MultiThread(VS2013 MFC多线程-含源码-含个人逐步实现文档).rar
- Activity 四种launchMode
launchMode在多个Activity跳转的过程中扮演着重要的角色,它可以决定是否生成新的Activity实例,是否重用已存在的 Activity实例,是否和其他Activity实例公用一个tas ...
- 弧形菜单2(动画渐入)Kotlin开发(附带java源码)
弧形菜单2(动画渐入+Kotlin开发) 前言:基于AndroidStudio的采用Kotlin语言开发的动画渐入的弧形菜单...... 效果: 开发环境:AndroidStudio2.2.1+gra ...
- 统计nginx日志
.根据访问IP统计UV awk '{print $1}' access.log|sort | uniq -c |wc -l .统计访问URL统计PV awk '{print $7}' access.l ...
- Python中的基础数据类型
Python中基础数据类型 1.数字 整型a=12或者a=int(2),本质上各种数据类型都可看成是类,声明一个变量时候则是在实例化一个类. 整型具备的功能: class int(object): & ...
- LoadRunner简单培训相关笔记
学校花了20万买了LoadRunner,因此作为幸运的一届,赶上了这场培训.以下为笔记以及培训后制作的简易思维导图. Loadrunner思维导图源码(Xmind): http://pan.baidu ...
- Python初学者第十九天 函数(3)
19day 函数 1.作用域 Python中,一个函数就是一个作用域.所有的局部变量都是放在当前的作用域里面 代码定义完成后,作用域已经生成,作用域链向上查找 2.匿名函数 当需要暂时性的用到一个函数 ...
- SharePoint问题杂集——要创建计时器作业,必须运行SVC
问题场景:在SharePoint2010服务器上使用PowerShell部署解决方案时,遇到问题: 解决办法是进入控制面板----管理工具----服务,找到SharePoint 2010 Admini ...
- 【2017.10.13 ROS机器人操作系统】ROS系统常用术语及资源
ROS机器人操作系统是一种后操作系统,提供了类似于软件开发中使用到的中间件的功能. ROS: Robot Operating System 机器人操作系统 Package: 功能包 Stack: 功能 ...