多线程程序好处就是可以提高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核心技术-多线程之基本使用的更多相关文章

  1. java核心技术-多线程基础

    进程.线程 ​ 进程(Process) 是程序的运行实例.例如,一个运行的 Eclipse 就是一个进程.进程是程序向操作系统申请资源(如内存空间和文件句柄)的基本单位.线程(Thread)是进程中可 ...

  2. java核心技术-多线程之引导概念

    前两篇文章分别讲了,Java线程相关基础概念以及线程的内存模型,本节作为后续章节的引导,个人认为对于学习后面的只是还是比较重要.好了,既然说了多线程,那么首先要弄清以下几个问题: 1. 什么是多线程? ...

  3. java核心技术-多线程之线程内存模型

    对于每一种编程语言,理解它的内存模型是理所当然的重要.下面我们从jvm的内存模型来体会下java(不限java语言,严格来讲是JVM内存模型,所有JVM体系的变成语言均适用)的内存模型. 堆: 就是我 ...

  4. java核心技术-多线程之线程基础

    说起线程,无法免俗首先要弄清楚的三个概念就是:进程.线程.协程.OK,那什么是进程,什么是线程,哪协程又是啥东西.进程:进程可以简单的理解为运行在操作系统中的程序,程序时静态代码,进程是动态运行着的代 ...

  5. 读《java核心技术卷一》有感

    过去一个多月了吧.才囫囵吞枣地把这书过了一遍.话说这书也够长的,一共706页.我从来不是个喜欢记录的人,一直以来看什么书都是看完了就扔一边去,可能有时候有那么一点想记录下来的冲动,但算算时间太紧,很多 ...

  6. java核心技术学习笔记之一程序设计概述

    Java 核心技术之一程序设计概述 一.   Java语言的特点 简单行 :取经于C++,排除了C++不常用的指针.结构等,增加垃圾回收. 面向对象:与C++不同是单继承,但是可以继承多接口.完全面向 ...

  7. 【Java】多线程初探

     参考书籍:<Java核心技术 卷Ⅰ >   Java的线程状态   从操作系统的角度看,线程有5种状态:创建, 就绪, 运行, 阻塞, 终止(结束).如下图所示     而Java定义的 ...

  8. java核心技术-(总结自杨晓峰-java核心技术36讲)

    1. 谈谈你对java平台的理解 首先是java最显著的两个特性,一次写入处处运行:还有垃圾收集器gc,gc能够对java内存进行管理回收,程序员不需要关心内存的分配和回收问题 然后谈谈jre和jdk ...

  9. java的优点和误解 《java核心技术卷i》第一章

    <java核心技术卷i>第一章主要内容包括三点: 1:Java白皮书的关键术语:描述Java的十一个关键字: 2:Java applet 3 :关于Java的常见误解   1:第一章:Ja ...

随机推荐

  1. ZooKeeper 典型应用场景

    Zookeeper基础知识 1.zookeeper是一个类似hdfs的树形文件结构,zookeeper可以用来保证数据在(zk)集群之间的数据的事务性一致. 2.zookeeper有watch事件,是 ...

  2. Output assignment statements in the output statement

    package output.statement; public class OutputAssignmentStatementsInTheOutputStatement { public stati ...

  3. RecyclerView之UI与数据绑定

    package activity.cyq.com.learnrsv; import android.support.v7.widget.RecyclerView; import android.vie ...

  4. Android深入四大组件(四)Android8.0 根Activity启动过程(前篇)

    前言 在几个月前我写了Android深入四大组件(一)应用程序启动过程(前篇)和Android深入四大组件(一)应用程序启动过程(后篇)这两篇文章,它们都是基于Android 7.0,当我开始阅读An ...

  5. Monkey测试运用实例

    测试命令是多样性的,根据个人的测试思路,设计执行你想要的测试命令 1.monkey -p com.junte -v 1000          团贷网模拟用户随机操作,无延时点击1000次 -p测试包 ...

  6. Event percentages解析

    Event percentages: 0:--pct-touch//touch events percentage触摸事件百分比(触摸事件是一个在屏幕单一位置的按下-抬起事件) 1:--pct-mot ...

  7. Forword与sendRedirect的区别

    二.本质区别 解释一 一句话,转发是服务器行为,重定向是客户端行为.为什么这样说呢,这就要看两个动作的工作流程: 转发过程:客户浏览器发送http请求——>web服务器接受此请求——>调用 ...

  8. 解决linux-mysql 登录时,报异常:Access denied for user 'root'@'localhost'

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/hhj724/article/details/73277506 解决linux-mysql 登录时,报 ...

  9. Ionic微信开发之环境配置

    在开发微信版的H5页面时,如果需要正常调用微信公众号的开放接口(测试或者发布情况),根据官方要求需要保证网页域名和后端维护的一致.因此,进行真服测试就显得很有必要.WebStorm提供了实时远程部署的 ...

  10. Linux Samba配置文件常用参数详解

    目录 1.全局参数 2.共享参数   Samba的主配置文件叫smb.conf,默认在/etc/samba/目录下. smb.conf含有多个段,每个段由段名开始,直到下个段名.每个段名放在方括号中间 ...