java多线程的优点_【java多线程的优点】

作者:Jakob Jenkov        翻译:古圣昌            校对:欧振聪

尽管面临很多挑战,在java学习中多线程有一些优点使得它一直被使用。这些优点是:

资源利用率更好

程序设计在某些情况下更简单

程序响应更快

资源利用率更好

想象一下,一个应用程序需要从本地文件系统中读取和处理文件的情景。比方说,从磁盘读取一个文件需要5秒,处理一个文件需要2秒。处理两个文件则需要:5秒读取文件A

2秒处理文件A

5秒读取文件B

2秒处理文件B

---------------------

总共需要14秒

复制代码

从磁盘中读取文件的时候,大部分的CPU时间用于等待磁盘去读取数据。在这段时间里,CPU非常的空闲。它可以做一些别的事情。通过改变操作的顺序,就能够更好的使用CPU资源。看下面的顺序:5秒读取文件A

5秒读取文件B + 2秒处理文件A

2秒处理文件B

---------------------

总共需要12秒

复制代码

CPU等待第一个文件被读取完。然后开始读取第二个文件。当第二文件在被读取的时候,CPU会去处理第一个文件。记住,在等待磁盘读取文件的时候,CPU大部分时间是空闲的。

总的说来,CPU能够在等待IO的时候做一些其他的事情。这个不一定就是磁盘IO。它也可以是网络的IO,或者用户输入。通常情况下,网络和磁盘的IO比CPU和内存的IO慢的多。

程序设计更简单

在单线程应用程序中,如果你想编写程序手动处理上面所提到的读取和处理的顺序,你必须记录每个文件读取和处理的状态。相反,你可以启动两个线程,每个线程处理一个文件的读取和操作。线程会在等待磁盘读取文件的过程中被阻塞。在等待的时候,其他的线程能够使用CPU去处理已经读取完的文件。其结果就是,磁盘总是在繁忙地读取不同的文件到内存中。这会带来磁盘和CPU利用率的提升。而且每个线程只需要记录一个文件,因此这种方式也很容易编程实现。程序响应更快将一个单线程应用程序变成多线程应用程序的另一个常见的目的是实现一个响应更快的应用程序。设想一个服务器应用,它在某一个端口监听进来的请求。当一个请求到来时,它去处理这个请求,然后再返回去监听。

服务器的流程如下所述:while(server is active){

listen for request

process request

}

复制代码如果一个请求需要占用大量的时间来处理,在这段时间内新的客户端就无法发送请求给服务端。只有服务器在监听的时候,请求才能被接收。另一种设计是,监听线程把请求传递给工作者线程(worker thread),然后立刻返回去监听。而工作者线程则能够处理这个请求并发送一个回复给客户端。这种设计如下所述:

while(server is active){

listen for request

hand request to worker thread

}

复制代码

这种方式,服务端线程迅速地返回去监听。因此,更多的客户端能够发送请求给服务端。这个服务也变得响应更快。

桌面应用也是同样如此。如果你点击一个按钮开始运行一个耗时的任务,这个线程既要执行任务又要更新窗口和按钮,那么在任务执行的过程中,这个应用程序看起来好像没有反应一样。相反,任务可以传递给工作者线程(word thread)。当工作者线程在繁忙地处理任务的时候,窗口线程可以自由地响应其他用户的请求。当工作者线程完成任务的时候,它发送信号给窗口线程。窗口线程便可以更新应用程序窗口,并显示任务的结果。对用户而言,这种具有工作者线程设计的程序显得响应速度更快。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/526839.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java boolean是什么_java中的boolean与Boolean有什么不同

java中的boolean与Boolean有什么不同发布时间:2020-11-11 15:59:21来源:亿速云阅读:74作者:Leah这篇文章给大家介绍java中的boolean与Boolean有什么不同,内容非常详细,感兴趣的小伙伴们可以参考借鉴&#x…

linux cmake编译安装mysql_Linux源码安装MySQL 5.6.12 (Cmake编译)

Linux源码安装MySQL 5.6.12 (Cmake编译)1.安装make编译器(默认系统自带)下载地址:tar zxvf make-3.82.tar.gzcd make-3.82./configuremakemake install2.安装bison下载地址:tar zxvf bison-2.5.tar.gzcd bison-2.5./configuremakemake install3.安装gcc-…

啊哈java_1.桶排序——啊哈算法java实现

/*** 题目:* 5个人考试得分分别为 5分,3分,5分,2分,8分;满分是10分;* 要将 5 3 5 2 8 这个数组进行降序排序;* 即排序后变为 8 5 5 3 2;* *//*** 桶排序解法: 建一个大小为11的一维数组a,a[0]~a[10]元素都初…

java成员变量的初始化_Java成员变量初始化过程

import java.util.*;public class Main{public static void main(String[] args){Student s new Student(5);s.show();}}class Person{public Person(){System.out.println("父初始化");show();}public void show(){System.out.println("父show");}}class…

java校招面试题_java校招面试编程题及答案.docx

java校招面试编程题及答案java校招面试编程题及答案  Java集合框架为Java编程语言的基础,也是Java面试中很重要的一个知识点。这里,我列出了一些关于Java集合的重要问题和答案。   集合框架是什么?说出一些集合框架的优点?   每种编程语言中都有…

合并两个有序数组 java_合并两个有序的数组

/*** 写在前面,题目要求的是将有序数组合并,那么有可能这所谓的有序是顺序或者逆序* 所以,应该在开始的时候判断一下* 然后,在比较的时候应该根据顺序逆序来写判断逻辑* 不过常规应该是顺序递增,然后就有了以下的代码&…

arp linux 清空_Linux怎么清理ARP缓存

1、系统初始arp环境[rootesx ~]# arp -nAddress HWtype HWaddress Flags Mask Iface192.168.1.175 ether 00:24:1D:97:B6:7F C vswif0192.168.1.120 ether 00:1F:C6:3A:DC:81 C vswif0192.168.1.51 (incomplete) vswif02、执行清除所有arp 缓存命令[rootesx ~]# arp -n|awk /^[…

ctf mysql hash传递_分享个 CTF 小工具 bruteHASH

别问,问就是为了 CTF思路源于一次三小时十二题的内部 CTF 竞赛,其中一道简单 MISC 给出明文范围(字母数字)和 MD5 开头,要求穷举出 flag——这当然不难,python 十几行代码搞定,但是运行出结果竟然用了近 20 分钟&#…

JAVA怎么实现网页退出系统_java后台实现js关闭本页面,父页面指定跳转或刷新操作...

关闭本页面,跳转到百度response.setCharacterEncoding("gbk");PrintWriter outresponse.getWriter();out.print("");out.print("");关闭本页面,刷新父页面response.setCharacterEncoding("gbk");PrintWriter ou…

huffman树java_HuffmanTree - java实现

该思想借鉴于《2019版数据结构高分笔记(c语言版)》- 第7版最近事多,有时间会把思路在这里阐述一下代码思路如下/*** add() 输入names[] weights[]* sort()排序* generateTree()生成树* preOrder() 先序遍历生成节点编码code* inOrder() 前序遍历输出编码** root* / …

java crontriggerbean_java – 使用JobStoreTX为石英聚类配置CronTriggerFactoryBean

我们正在使用Quartz 2.1.5;我们设置了以下属性:org.quartz.jobStore.classorg.quartz.impl.jdbcjobstore.JobStoreTXorg.quartz.jobStore.driverDelegateClassorg.quartz.impl.jdbcjobstore.CloudscapeDelegateorg.quartz.jobStore.useProperties trueorg.quartz.j…

利用文本文档运行java程序_java代码创建文件夹和读取文本文件txt的内容(可运行)...

java代码创建文件夹和读取文本文件txt的内容(可运行)读取txt 的内容 和 创建一个 新的文件夹package com.sec.file;import java.io.BufferedReader;import java.io.File;import java.io.FileReader;public class ReaderFile {public static void main(String[] args) throws Ex…

java ssh 那一层应该捕获异常_java ssh异常(大神来看看啊)

提一个小问题呢!ssh框架整合时 我看别人的代码都不对异常做处理,这是为什么呢 如不比如Dao操作数据库的代码中都没用throws异常,那service层中的应该是取不到抛出的异常才对啊,那这样在service层事务的交给Spring来管理的service层取不到异常…

java web 润乾报表教程_润乾报表开发 基础教程.ppt

润乾报表开发 ——基础教程 主格和附属格 单元格进行扩展的过程中,缺省情况下,相对于其右(下)边的单元格而言,扩展格是主动复制的,被称为其它格(其右/下的格)的主格,而其右(下)的单元格是被动跟随复制的,被…

java 布尔逻辑运算符_Java运算符

Java语言提供许多操作符。操作符是特殊的符号(symbol),它对一个或者两个、三个的操作数进行运算,然后返回一个结果,最简单的就像我们一年级学到的 -号。一般地,可以将运算符分为四大类:算数运算符、位运算符、关系运算…

java7 异常继承_Java基础7-异常;jar包

使用接口进行如下程序设计个人电脑(PC)具有PCI插槽,可以插入PCI卡。显卡、声卡、语音卡都可以作为PCI卡插入PCI插槽中PC,PCI,slot,VideoCard,SoundCard, VoiceCardinterface PCI{public void pci();}class VideoCard implements PCI{public void pci(){System.out.p…

Java自动化获取页面主题_基于Selenium2+Java的UI自动化(4) - WebDriver API简单介绍

1. 启动浏览器前边有详细介绍启动三种浏览器的方式(IE、Chrome、Firefox);private WebDriver driver null;private String chromeDriverDir "D:\\workspace\\A_Test\\resource\\chromedriver.exe";/*** 打开谷歌浏览器;*/public void openCh…

java字符串压缩js解压_接口实现后台GZIP压缩,pako.js 前端解压

import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.util.zip.GZIPInputStream;import java.util.zip.GZIPOutputStream;public class GZIPUtils {/*** 字符串的压缩** param str* 待压缩的字符串* return 返回…

java list初始值null_关于list集合存储null的问题

工作中,遇到list集合存储null的问题,不确定list能否存储null值。于是写一些demo测试list,set,table,及map存储null的问题。1.list之arraylist1 public static voidmain(String[] args) {2 String string null;3 List list new ArrayList();4 …

js java 反射机制_java 类加载机制和反射机制

一.类的加载机制jvm把class文件加载到内存,并对数据进行校验、解析和初始化,最终形成jvm可以直接使用的java类型的过程。(1)加载将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区中的运行时数据结构,在堆中生成一…