多线程是改进顺序执行任务的利器之一。但多线程的使用,却带来这样那样的问题。先认识一下多线程。多线程就是利用多个最少执行单元在较短的时间内利用多核处理器近乎同时的执行同一个任务的不同部分,或者是不同任务。使得原来需要串行执行的任务能够并发的执行。这样的好处在于,缩短了这次任务的执行时间,给用户更好的响应。但多线程却未必会带来性能上的提高,因为多线程要考虑到多个线程的创建成本,多线程之间的上下文切换和挂起等消耗,甚至要考虑到共享资源的争夺消耗等,这些都为多线程使用增加了门槛。但多线程的提高任务执行时间的特点使得多线程的使用成为了必须。
先通过一个例子粗略的认识一下多线程的这个优点哈。
对一个拥有30个集合的任务进行排序操作。如果利用单任务的话,那么就是一个集合一个集合的顺序排序,最终排序完成就算任务完成。具体实例代码如下:
package multiThreadShow;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class NomalSeqTaskShow {
@SuppressWarnings("unchecked")
public static void main(String[] args){
HashMap<Integer, ArrayList<Integer>> map = new HashMap<Integer,ArrayList<Integer>>();
for(int i=0;i<50;i++){
ArrayList<Integer> arrayList= new ArrayList<Integer>();
for(int i1=0;i1<10000;i1++){
int p = (int) (Math.random()*10000);
arrayList.add(p);
}
map.put(i, arrayList);
}
long start = System.currentTimeMillis();
for(int i : map.keySet()){
Collections.sort(map.get(i));
}
long end = System.currentTimeMillis();
System.out.println("Excuting this totally costs "+(end - start));
}
}
执行时间如下:
Excuting this totally costs 178
当通过简单的并发处理之后,执行的时间总时间就以最后完成的那个线程完成排序的时间为止了。这样的话,虽然有可能其中有些排序完成的消耗时间大于单线程执行消耗的时间,但是总时间却有可能减少。 具体代码如下:
package multiThreadShow;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.concurrent.CountDownLatch;
public class MultiThreadShow {
public static void main(String[] args){
HashMap<Integer, ArrayList<Integer>> map = new HashMap<Integer,ArrayList<Integer>>();
for(int i=0;i<50;i++){
ArrayList<Integer> arrayList= new ArrayList<Integer>();
for(int i1=0;i1<10000;i1++){
int p = (int) (Math.random()*10000);
arrayList.add(p);
}
map.put(i, arrayList);
}
CountDownLatch doneSignal = new CountDownLatch(map.size());
long start = System.currentTimeMillis();
for(int i : map.keySet()){
SortThread t= new SortThread(doneSignal,"SortThread"+i);
t.setArrayList(map.get(i));
t.start();
}
try {
doneSignal.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
long end = System.currentTimeMillis();
System.out.println("Excuting this totally costs "+(end - start));
}
}
class SortThread extends Thread{
private ArrayList<Integer> arrayList;
private final CountDownLatch doneSignal;
public ArrayList<Integer> getArrayList() {
return arrayList;
}
public void setArrayList(ArrayList<Integer> arrayList) {
this.arrayList = arrayList;
}
public SortThread(CountDownLatch doneSignal,String name){
super(name);
this.doneSignal = doneSignal;
}
public void run(){
Collections.sort(arrayList);
doneSignal.countDown();
//System.out.println("Sort finished"+this.getName());
}
}
执行消耗时间如下:
Excuting this totally costs 118
结果可以看到,多线程使用合适的话,对提高任务的执行效率还有很有帮助了。这也是本文开始研究并发程序设计的初衷了。
分享到:
相关推荐
Java高并发编程从入门到精通,附有源码。详细讲解了java并发编程
《Java并发编程从入门到精通》作者结合自己10多年Java并发编程经验,详细介绍了Java并发编程的基础概念、工作原理、编程技巧和注意事项,对Java高性能高并发编程有极大的参考价值。 《Java并发编程从入门到精通》...
原书作者it行业从业时间12年,多家it公司担任研发总监,技术总监(韩剑锋)。 如果你想成为一名架构师,资深的技术大牛,强烈推荐你读一读此书。 本书内容讲解深入浅出,掌握起来毫不费力。
│ 高并发编程第一阶段24讲、线程间通信快速入门,使用wait和notify进行线程间的数据通信.mp4 │ 高并发编程第一阶段25讲、多Produce多Consume之间的通讯导致出现程序假死的原因分析.mp4 │ 高并发编程第一阶段26...
java并发编程入门 基本概念 并发: 同时拥有俩个或者多个线程,如果线程在单核处理器上运行,多个线程将交替的换入或者换出内存,这些线程是同时 "存在" 的,每个线程都处于执行过程中的某个状态,如果运行在多核...
主要介绍了Java并发程序入门 ,需要的朋友可以参考下
并发编程一直都存在,只不过过去的很长时间里,比较难以实现,随着互联网的发展,人口红利的释放,更加友好的支持并发编程已经成了主流编程语言的标配,而对于软件开发人员来说,没有玩过并发编程都会有点不好意思。...
Java并发编程线程入门简介.pdf
01、【中级原理】java多线程并发编程入门原理精通视频教程 02、【中级原理专题】java并发编程多线程高级专题课程 03. 【中级原理】高并发编程原理和线程池精通教程 04、【高级原理】Java并发多线程编程基础原理与...
Java并发编程线程入门简介[借鉴].pdf
并发编程从入门到放弃系列开始和结束.doc
如果你是并发编程新手 ,一定硕果累累;如果你刚并发编程入门,将上一个台阶;如果你已经是大神级别,当吃瓜群众吧! PPT内容包括:线程基础、线程对象、线程通信、原子操作、线程池、并发工具。
java并发编程-从入门到精通,相当不错的文档,可以看看,高清
│ 高并发编程第一阶段24讲、线程间通信快速入门,使用wait和notify进行线程间的数据通信.mp4 │ 高并发编程第一阶段25讲、多Produce多Consume之间的通讯导致出现程序假死的原因分析.mp4 │ 高并发编程第一阶段26...
ORACLE EBS 入门与提高 请求组 数据组 自定义并发程序
本资源为大学生提供了Go语言的入门教程,通过简单易懂的语言和实际案例,讲解了Go语言的基本概念、语法和编程技巧。 适用人群:对编程感兴趣的大学生,想要学习网络服务和并发编程的学生。 使用场景及目标:适用于...
Java面试题+Java并发编程(J.U.C)+Java8实战+Redis+kafka Java 『必看』2021 版最新Java 学习路线图(持续刷新):+1::+1::+1: Java入门面试题 Java基础入门80问,适合新手,老鸟直接跳过 Java并发编程(J.U.C) ...