浅淡Java多线程
工作中一直忙着实现业务逻辑,多线程接触得不多。对多线程的认知,一直停留在Thread和Runnable上。最近心血来潮,找了几本多线程的书,不看不知道,一看吓一跳。原来我对多线程的理解是多么的肤浅
。记录一下所学,以加深印象。
线程越多,是不是处理起来就越快呢?举个例子,男人(CPU),老婆(线程),那问题可以转换成:是不是老婆越多越好?答案相信大家心中有数。什么?你觉得老婆越多越好?虽然你可能有一夜七次郎的能力,但是你有49个老婆的话,每人一周只有一次。老婆们就会出现问题的。皇帝(一个CPU)却有后宫佳丽3000(3000个线程),他照顾不过来的。
好,既然线程不是越多越好,那么开多少个线程才合适呢?这我们得分情况看,我们把计算机要完成的事情称为任务。那么任务可以分为两种:
1. 计算密集型
是指纯粹CPU计算比较多的任务。比如:求 1000000 以内所有的素数。这种任务我们基本只需要开和CPU个数相同的线程就可以了。线程多了,CPU对线程的调度次数也就多了,这都是要花时间的,这些时间也是不必要的。CPU本就处于忙碌状态,你还让它切换来切换去,这不是没事还找事么? 如果有多个CPU,还需要考虑平衡分配给各个CPU的任务,不能说这个CPU早就完成任务了,另外一个还有很多任务没完成。 假设你的老大分配给你的任务是别人的10倍,你是啥样的心情啊?
2. IO密集型
是指IO操作比较多的任务。比如读写文件、读写网络流。这些都是比较慢的操作,CPU有较长的空闲的时间,我们就需要开高于CPU个数的线程,让CPU不要闲着。具体开多少个线程,还需根据实际业务情况,多进行测试,找到一个合适的值。
浅淡Java多线程的更多相关文章
- 浅谈 Java 多线程(一) --- JMM
为什么使用多线程 更多的处理器核心数(硬件的发展使 CPU 趋向于更多的核心数,如果不能充分利用,就无法显著提升程序的效率) 更快的响应时间(复杂的业务场景下,会存在许多数据一致性不强的操作,如果将这 ...
- 转载:浅谈Java多线程的同步问题【很好我就留下来,多分共享】
转载:http://www.cnblogs.com/phinecos/archive/2010/03/13/1684877.html#undefined 多线程的同步依靠的是对象锁机制,synchro ...
- 浅谈Java多线程的同步问题 【转】
多线程的同步依靠的是对象锁机制,synchronized关键字的背后就是利用了封锁来实现对共享资源的互斥访问. 下面以一个简单的实例来进行对比分析.实例要完成的工作非常简单,就是创建10个线程,每个线 ...
- 浅谈Java多线程同步机制之同步块(方法)——synchronized
在多线程访问的时候,同一时刻只能有一个线程能够用 synchronized 修饰的方法或者代码块,解决了资源共享.下面代码示意三个窗口购5张火车票: package com.jikexueyuan.t ...
- 浅谈Java多线程
线程与进程 什么是进程? 当一个程序进入内存中运行起来它就变为一个进程.因此,进程就是一个处于运行状态的程序.同时进程具有独立功能,进程是操作系统进行资源分配和调度的独立单位. 什么是线程? 线程是进 ...
- 浅谈Java多线程中的join方法
先上代码 新建一个Thread,代码如下: package com.thread.test; public class MyThread extends Thread { private String ...
- Java 多线程并发编程一览笔录
Java 多线程并发编程一览笔录 知识体系图: 1.线程是什么? 线程是进程中独立运行的子任务. 2.创建线程的方式 方式一:将类声明为 Thread 的子类.该子类应重写 Thread 类的 run ...
- 40个Java多线程问题总结
前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...
- Java多线程问题总结
前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...
随机推荐
- Java分支循环结构
一.Java分支结构 1.if语句:一个 if 语句包含一个布尔表达式和一条或多条语句. if 语句的用语法如下: if(布尔表达式){ 如果布尔表达式为true将执行的语句 } public c ...
- 常用js方法函数
常用方法函数 1.深复制 // 1.深复制 function deepCopy(source) { var result = {}; for (var key in source) { result[ ...
- SQL语句性能优化操作
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by涉及的列上建立索引. 2.应尽量避免在where子句中对字段进行null值判断,创建表时NULL是默认值,但大多数时候应 ...
- ASP.Net .Net4.0 HTTP 错误 404.17 - Not Found
源:ASP.Net .Net4.0 HTTP 错误 404.17 - Not Found 用了网上很多方法,最后是用这个网友的方法解决的,在此做个记录. VS2010编写WebService与在IIS ...
- 冷门PHP函数汇总
概述 整理一些日常生活中基本用不到的PHP函数,也可以说在框架内基本都内置了,无需我们去自行使用的函数.量不多.后续在日常开发中如遇到更多的冷门,会更新本文章 sys_getloadavg 获取系统的 ...
- ubuntu上swift开发学习2
使用包管理器(package manager)创建一个可执行的项目 1. 创建一个Hello目录,然后进入目录 $ mkdir Hello $ cd Hello 2. 使用包初始化命令,参数表示创建一 ...
- Redis常用数据结构和操作
1.String 存入字符类型 Set name luowen 设置name = luowen 存储 Get name 获取设置好的name的值 Setnx name luowen 设置name键值为 ...
- listen 69
Today Is Unlucky for People Who Have Bad Luck Today If you have Paraskevidekatriaphobia, today is no ...
- linux安装与卸载软件
在ubuntu系统中,通常使用apt-get命令完成对软件的安装与卸载 安装的软件通常都放置在一些源中,国内有很多镜像源供下载使用,而系统设置的源保存在目录/etc/apt/sources.list文 ...
- selenium总结
个人对selenium的理解: 1.使用selenium操作浏览器,实际上是使用selenium框架下的webdriver启动各浏览器的驱动实现对浏览器的操作的.以下两句代码即可启动firefox浏览 ...