多线程程序好处就是可以提高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. Spring Data MongoDB 级联操作

    DBRef 方式关联 DBRef 就是在两个Collection之间定义的一个关联关系,暂不支持级联的保存功能 例子:一个Person对象有多个Book对象,一对多关系 实体Person public ...

  2. Linux / mysql: is it safe to copy mysql db files with cp command from one db to another?

    Copying is very simple for MyISAM and completely 100% risky (near suicidal) with InnoDB. From your q ...

  3. apply方法和call方法的详解2

    1.apply和call的区别在哪里 2.什么情况下用apply,什么情况下用call 3.apply的其他巧妙用法(一般在什么情况下可以使用apply) 我首先从网上查到关于apply和call的定 ...

  4. 星空灯改装成USB供电

    简单的手工活,20分钟搞定 1.用一根USB线剪断,将红黑两根线分别连接到星空灯电源供电的正负极 2.由于USB输出5V 0.5A的电流,因此需要改装下,办法一,加电阻,办法二,换灯泡,由于小电阻并不 ...

  5. git 和github

    ssh git:    是一个版本管理工具,是可以在你电脑不联网的情况下,只在本地使用的一个版本管理工具,其作用就是可以让你更好的管理你的程序,比如你原来提交过的内容,以后虽然修改了,但是通过git这 ...

  6. Redis 集群缓存测试要点--关于 线上 token 失效 BUG 的总结

    在测试账户系统过程中遇到了线上大面积用户登录态失效的严重问题,事后对于其原因及测试盲点做了一些总结记录以便以后查阅,总结分为以下7点,其中原理性的解释有些摘自网络. 1.账户系统token失效问题复盘 ...

  7. 《C++ Primer Plus》读书笔记之五—函数-C++的编程模块

    函数-C++的编程模块   1.C++对于返回值的类型有一定的限制:不能是数组,但可以是其他任何类型——整数.浮点数.指针,甚至可以是结构和对象(有趣的是,虽然C++函数不能直接返回数组,但可以将数组 ...

  8. MySQL 数据库 -- 数据操作

    数据的增删改 一 介绍 MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过 ...

  9. oracle给用户分配特定用户下特定表的只读权限

    以下是测试过程,测试环境oracle 11.2.0.3 linux平台: 模拟将HR用户下的employees表的只读权限非配给test_ycr创建用户:SQL> create user tes ...

  10. 使用LR的socket协议进行进行性能测试,转解决方案

    在用LR对公司delphi开发的C/S程序进行测试时,发现只有选择socket协议可以录制代码,经研究是通过TCP/IP的方式将参数保存在buffer中发送的方式来完成操作,但由于将buffer内容参 ...