java 多线程学习笔记(一) -- 计算密集型任务
最近在看《Java虚拟机并发编程》,在此记录一些重要的东东。
线程数的确定:
1. 获取系统可用的处理器核心数:int numOfCores = Runtime.getRuntime().availableProcessors()
2. 如果任务是计算密集型的,则线程数 = numOfCores
如果任务是IO密集型的,则线程数 = numOfCores / (1 - 阻塞系数), 其中阻塞系数在0~1之间。
注:如果任务被阻塞的时间大于执行时间, 则这些任务是IO密集型的,我们就需要创建比处理器核心数大几倍数量的线程
在解决问题的过程中使处理器一直保持忙碌状态比将负载均摊到每个子任务要实惠得多。
任务完成并不代表线程消亡。
计算密集型任务:如求1到10000000内所有素数的个数
1. AbstractPrimeFinder
public abstract class AbstractPrimeFinder { public boolean isPrime(final int number){
if(number <= 1) return false; for(int i = 2; i <=Math.sqrt(number); i++){
if (number % i == 0)
return false;
}
return true;
} public int countPrimesInRange(final int lower, final int upper){
int total = 0;
for( int i = lower; i <= upper; i++){
if(isPrime(i))
total++;
}
return total;
} public void timeAndComputer(final int number){
long start = System.nanoTime();
int numberOfPrimes = countPrimes(number);
long end = System.nanoTime(); System.out.printf("Number of primes under %d is %d\n", number, numberOfPrimes);
System.out.println("Spend time(seconds) is " + (end-start)/1.0e9);
} public abstract int countPrimes(final int number);
}
2. ConcurrentPrimeFinder
/**
* 对于计算密集型的任务,增加线程数并没有什么意义,线程数应该等于CPU内核数。如果较难把任务均摊到CPU,则
* 可以把任务切分成较多块,以确保CPU完成某块任务后,可以继续处理其它块。防止某个CPU完成任务后处于空闲状态。
* @author shj
*
*/
public class ConcurrentPrimeFinder extends AbstractPrimeFinder{
private final int poolSize;
private final int numberOfParts; public ConcurrentPrimeFinder(int poolSize, int numberOfParts){
this.poolSize = poolSize;
this.numberOfParts = numberOfParts;
} @Override
public int countPrimes(final int number) {
int count = 0 ;
try{
List<Callable<Integer>> partitions = new ArrayList<>();
int chunksPerPartition = number / numberOfParts;
for(int i = 0; i < numberOfParts; i++){
final int lower = (i * chunksPerPartition) + 1;
final int upper = (i == numberOfParts - 1) ? number : lower + chunksPerPartition - 1;
partitions.add(new Callable<Integer>(){
public Integer call(){
return countPrimesInRange(lower, upper);
}
});
} ExecutorService executorPool = Executors.newFixedThreadPool(poolSize);
List<Future<Integer>> results = executorPool.invokeAll(partitions, 10000, TimeUnit.SECONDS);
executorPool.shutdown(); for(Future<Integer> result : results){
count += result.get();
}
}catch(Exception e){
e.printStackTrace();
}
return count;
} public static void main(String[] args){
int cores = Runtime.getRuntime().availableProcessors();
int numberOfParts = 20; //划分成子区间的数量, 修改此值查看运行时间的变化
new ConcurrentPrimeFinder(cores,numberOfParts).timeAndComputer(10_000_000);
}
}
java 多线程学习笔记(一) -- 计算密集型任务的更多相关文章
- Java多线程学习笔记(一)——多线程实现和安全问题
1. 线程.进程.多线程: 进程是正在执行的程序,线程是进程中的代码执行,多线程就是在一个进程中有多个线程同时执行不同的任务,就像QQ,既可以开视频,又可以同时打字聊天. 2.线程的特点: 1.运行任 ...
- java多线程学习笔记——详细
一.线程类 1.新建状态(New):新创建了一个线程对象. 2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中, ...
- JAVA多线程学习笔记(1)
JAVA多线程学习笔记(1) 由于笔者使用markdown格式书写,后续copy到blog可能存在格式不美观的问题,本文的.mk文件已经上传到个人的github,会进行同步更新.github传送门 一 ...
- Java多线程学习笔记
进程:正在执行中的程序,其实是应用程序在内存中运行的那片空间.(只负责空间分配) 线程:进程中的一个执行单元,负责进程汇总的程序的运行,一个进程当中至少要有一个线程. 多线程:一个进程中时可以有多个线 ...
- Java多线程学习笔记--生产消费者模式
实际开发中,我们经常会接触到生产消费者模型,如:Android的Looper相应handler处理UI操作,Socket通信的响应过程.数据缓冲区在文件读写应用等.强大的模型框架,鉴于本人水平有限目前 ...
- java 多线程学习笔记
这篇文章主要是个人的学习笔记,是以例子来驱动的,加深自己对多线程的理解. 一:实现多线程的两种方法 1.继承Thread class MyThread1 extends Thread{ public ...
- Java 多线程学习笔记:生产者消费者问题
前言:最近在学习Java多线程,看到ImportNew网上有网友翻译的一篇文章<阻塞队列实现生产者消费者模式>.在文中,使用的是Java的concurrent包中的阻塞队列来实现.在看完后 ...
- java多线程学习笔记(三)
java多线程下的对象及变量的并发访问 上一节讲到,并发访问的时候,因为是多线程,变量如果不加锁的话,会出现“脏读”的现象,这个时候需要“临界区”的出现去解决多线程的安全的并发访问.(这个“脏读”的现 ...
- Java多线程学习笔记(一)
一 概述 一个进程只有一个至少会运行一个线程,Java中同样存在这样,在调用main方法的时候,线程又JVM所创建. package link.summer7c.test; public class ...
随机推荐
- node.js+express验证码的实现
安装ccap库 npm install ccap var ccap = require(); var captcha = ccap({ width:190, height:50, offset:30, ...
- codeforces 622C C. Not Equal on a Segment
C. Not Equal on a Segment time limit per test 1 second memory limit per test 256 megabytes input sta ...
- linux命令学习笔记(20):find命令之exec
find是我们很常用的一个Linux命令,但是我们一般查找出来的并不仅仅是看看而已,还会有进一步的操作, 这个时候exec的作用就显现出来了. exec解释: -exec 参数后面跟的是command ...
- cmd cvf war包
1.进入要打包的目录下 --> cmd d: cd \路径 jar -cvf 包名.war * 2.解压 进入需要解压的目录 cd /depa123/webapps/css jar -xvf / ...
- bzoj 2732: [HNOI2012]射箭 半平面交
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=2732 题解: 这道题的做法我不想说什么了... 其他题解都有说做法... 即使是我上午做 ...
- 立方体贴图(Cubemap)
http://blog.csdn.net/asdjy123/article/details/51190643 点击打开链接 好东西保存方便查看 立方体贴图(Cubemap) 原文 Cubemaps 作 ...
- XMPP群聊消息重复,自己收到自己发出的消息,群警告消息如何屏蔽
在XMPP的"groupchat"中,创建群的时候会收到群发的"This room is locked from entry until configuration is ...
- 洛谷P4721 【模板】分治 FFT(生成函数+多项式求逆)
传送门 我是用多项式求逆做的因为分治FFT看不懂…… upd:分治FFT的看这里 话说这个万恶的生成函数到底是什么东西…… 我们令$F(x)=\sum_{i=0}^\infty f_ix^i,G(x) ...
- 问题:JsonConvert;结果:JSON详解
JSON详解 JSON的全称是”JavaScript Object Notation”,意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式.XML也是一种数据交换格 ...
- python 基础 操作文件和目录
获得当前目录路径 :os.getcwd() 返回指定目录下的所有文件和目录名:os.listdir() 删除一个文件:os.remove(filename) 删除多个空目录 :os.removefir ...