Java并发(三):实例引出并发应用场景
前两篇介绍了一些Java并发的基础知识,博主正巧遇到一种需求:查询数据库,根据查询结果集修改数据库记录,但整个流程是做成了一个schedule的,并且查询比较耗时,并且需要每两分钟执行一次,cpu经常因等待服务器响应的查询结果而进入等待,故需要在此基础上考虑性能优化,sql优化可以提高一些系统效率,同样,多线程也可以...
下面博主做个DEMO引出一些Java并发的实际应用场景:
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*; public class TestThread implements Runnable{ private String name; private Integer i = 0; List list = new ArrayList(); public TestThread(String name) {
this.name=name;
for(int i=0; i<100; i++){
list.add(i);
}
} @Override
public void run() {
Long past = System.currentTimeMillis();
get();
System.out.println(System.currentTimeMillis()-past);
}
private void get(){ while(true){
try{
Thread.sleep(200);
}catch(Exception e){
e.printStackTrace();
}
synchronized (i){
if(i>=100){
break;
}
System.out.println(list.get(i++));
} } } public static void main(String[] args) {
//线程池方式
ExecutorService exector = new ThreadPoolExecutor(5, 7, 30,
TimeUnit.MINUTES, new ArrayBlockingQueue<>(10));
//对于最大线程数和核心线程数的参考值,对于cpu密集型任务,可以选择NCPU+1,对于耗时较长的IO操作,可以选择2*NCPU
TestThread a = new TestThread("A");
exector.execute(a);
exector.execute(a);
exector.execute(a);
exector.execute(a);
exector.execute(a);
exector.execute(a);
exector.execute(a);
exector.execute(a); //普通方式
/*TestThread a = new TestThread("A");
new Thread(a).start();
new Thread(a).start();
new Thread(a).start();
new Thread(a).start();*/
}
}
TIP:不推荐使用Executors.newFixedThreadPool()来创建线程池,大家看底层代码:
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
newFixedThreadPool()方法底层还是调用了new ThreadPoolExecutor(),但线程等待队列(LinkedBlockingQueue)默认是不限定其长度的,意味着有大量线程入队时,会有内存溢出的风险,推荐大家使用new ThreadPoolExecutor()来创建线程池...
通过以上代码(可以跑)感受得到单线程和多线程的性能差距,设备越好,cpu核数越多,应该结果越明显,当然这不是绝对的,有时我们得考虑多线程的上下文切换的时间占用率和多线程同步的性能消耗...另外,我们平常应该使用线程池来管理线程,因为比较方便,JavaAPI也已经将细节实现到位,各位可以用这样线程安全的方式结合索引遍历集合,这样对于集合内的元素就可以多线程遍历并触发各自的操作,例如更新数据库等,可以说非常实用...
多线程使用的主要目的在于:
1、吞吐量:你做WEB,容器帮你做了多线程,但是他只能帮你做请求层面的。简单的说,可能就是一个请求一个线程。或多个请求一个线程。如果是单线程,那同时只能处理一个用户的请求。
2、伸缩性:也就是说,你可以通过增加CPU核数来提升性能。如果是单线程,那程序执行到死也就利用了单核,肯定没办法通过增加CPU核数来提升性能。
参考博文:http://www.cnblogs.com/dolphin0520/p/3932921.html
Java并发(三):实例引出并发应用场景的更多相关文章
- Effective Java 第三版——81. 优先使用并发实用程序替代wait和notify
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...
- 《java学习三》并发编程 -------线程池原理剖析
阻塞队列与非阻塞队 阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞.试图从空的阻塞队列中获取元素的线程将会被阻塞,直到 ...
- Android学习笔记:多个AsyncTask实例的并发问题
AsyncTask是Android给开发者提供的一个简单轻量级的多线程类,通过它我们可以很容易新建一个线程让在后台做一些耗时的操作(如IO操作.网络访问等),并在这个过程中更新UI.之所以说它轻量级, ...
- Java内存模型JMM 高并发原子性可见性有序性简介 多线程中篇(十)
JVM运行时内存结构回顾 在JVM相关的介绍中,有说到JAVA运行时的内存结构,简单回顾下 整体结构如下图所示,大致分为五大块 而对于方法区中的数据,是属于所有线程共享的数据结构 而对于虚拟机栈中数据 ...
- Java并发指南3:并发三大问题与volatile关键字,CAS操作
本文转载自互联网,侵删 序言 先来看如下这个简单的Java类,该类中并没有使用任何的同步. 01 final class SetCheck { 02 private int a = 0; 03 ...
- Java 8 LongAdders:管理并发计数器的正确方式
转自:http://www.importnew.com/11345.html 我只是喜欢新鲜的事物,而Java 8 有很多新东西.这次我想讨论其中我最喜欢的之一:并发加法器.这是一个新的类集合,他们用 ...
- Java并发——同步容器与并发容器
同步容器类 早期版本的JDK提供的同步容器类为Vector和Hashtable,JDK1.2 提供了Collections.synchronizedXxx等工程方法,将普通的容器继续包装.对每个共有方 ...
- 【Java基础】线程和并发机制
前言 在Java中,线程是一个很关键的名词,也是很高频使用的一种资源.那么它的概念是什么呢,是如何定义的,用法又有哪些呢?为何说Android里只有一个主线程呢,什么是工作线程呢.线程又存在并发,并发 ...
- Java进阶7并发优化4——JDK并发数据结构
Java进阶7并发优化4——JDK并发数据结构20131114 由于并发程序和串行程序的不同特点,在串行程序中使用的数据结构可能无法在并行程序中直接的正常使用,因为这些数据结构可能不是线程安全的,所以 ...
随机推荐
- C++知识点总结(三)
1.字符串查找字符函数strchr strchr函数原型:extern char*strchr(const char *s,char c); 功能:查找字符数组s中首次出现字符c的位置 说明:返回首次 ...
- 【总结整理】JavaScript的DOM事件学习(慕课网)
事件:在文档或者浏览器窗口中发生的一些,特定的交互瞬间 HTML和JavaScript的交互通过事件 来实现 比如:1.滚动条向下滑动,加载图片 2.图片轮播,鼠标由2-5页调换 本章内容1.理解事件 ...
- 5、预测和鉴定miRNA的靶基因
转载:http://www.oebiotech.com/Article/mirnabjyyc.html http://www.ebiotrade.com/newsf/2014-9/2014925941 ...
- 【机器学习】推荐系统、SVD分解降维
推荐系统: 1.基于内容的实现:KNN等 2.基于协同滤波(CF)实现:SVD → pLSA(从LSA发展而来,由SVD实现).LDA.GDBT SVD算是比较老的方法,后期演进的主题模型主要是pLS ...
- 1、jquery_属性和选择器
1.ID选择器 2.attr和val和removeattr 3.attr和removeattr和val <html> <head> <meta charset=" ...
- 一套简单的web即时通讯——第二版
前言 接上一版,这一版的页面与功能都有所优化,具体如下: 1.优化登录拦截 2.登录后获取所有好友并区分显示在线.离线好友,好友上线.下线都有标记 3.将前后端交互的值改成用户id.显示值改成昵称ni ...
- CODING 告诉你硅谷的研发项目管理之道(3)
前言: 本文为 CODING 教你一步步从一个程序员变身成管理者系列文章的第三篇,文章内容来自 Unity 的一位研发总监,详细叙述了他的管理风格和处事态度,同时列举了很多扩展阅读材料来帮助读者更全面 ...
- 七层登录——VB.NET版
敲完三层后,感觉还是对三层架构没有那么亲切,和小伙伴交流后,他们说多多敲几遍,就懂了,其实就是那么几条线,所以:不管会不会,先去做吧! 下面是关于七层的包图: 我的解决方案: 代码部分: U层: &l ...
- CF 984C Finite or not? (数论)
CF 984C Finite or not? (数论) 给定T(T<=1e5)组数据,每组数据给出十进制表示下的整数p,q,b,求问p/q在b进制意义下是否是有限小数. 首先我们先把p/q约分一 ...
- 括号序列(区间dp)
括号序列(区间dp) 输入一个长度不超过100的,由"(",")","[",")"组成的序列,请添加尽量少的括号,得到一 ...