`
shuofenglxy
  • 浏览: 194459 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

并发程序入门

阅读更多
多线程是改进顺序执行任务的利器之一。但多线程的使用,却带来这样那样的问题。先认识一下多线程。多线程就是利用多个最少执行单元在较短的时间内利用多核处理器近乎同时的执行同一个任务的不同部分,或者是不同任务。使得原来需要串行执行的任务能够并发的执行。这样的好处在于,缩短了这次任务的执行时间,给用户更好的响应。但多线程却未必会带来性能上的提高,因为多线程要考虑到多个线程的创建成本,多线程之间的上下文切换和挂起等消耗,甚至要考虑到共享资源的争夺消耗等,这些都为多线程使用增加了门槛。但多线程的提高任务执行时间的特点使得多线程的使用成为了必须。

先通过一个例子粗略的认识一下多线程的这个优点哈。

对一个拥有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


结果可以看到,多线程使用合适的话,对提高任务的执行效率还有很有帮助了。这也是本文开始研究并发程序设计的初衷了。


分享到:
评论
3 楼 酒杯中的大海 2011-03-03  
shuofenglxy 写道
酒杯中的大海 写道
lz为什么多线程会快,是因为你的机器是双核的,如果是单核的,绝对是单线程的快!~(没测试过,但是差不多)

额  你这么理解也是正确的。
多线程与单线程的区别再去,多线程用了更多的硬件资源cpu 内存等来并发的完成一些列相互独立的子任务。要点在于控制合适的并发线程数目,从而充分高效的利用硬件资源,线程并不是越多越好,因为越多的线程意味着越多的线程上下文切换,这个代价某种条件下也是惊人的。

这样说就是正确的!~
2 楼 shuofenglxy 2011-03-02  
酒杯中的大海 写道
lz为什么多线程会快,是因为你的机器是双核的,如果是单核的,绝对是单线程的快!~(没测试过,但是差不多)

额  你这么理解也是正确的。
多线程与单线程的区别再去,多线程用了更多的硬件资源cpu 内存等来并发的完成一些列相互独立的子任务。要点在于控制合适的并发线程数目,从而充分高效的利用硬件资源,线程并不是越多越好,因为越多的线程意味着越多的线程上下文切换,这个代价某种条件下也是惊人的。
1 楼 酒杯中的大海 2011-03-02  
lz为什么多线程会快,是因为你的机器是双核的,如果是单核的,绝对是单线程的快!~(没测试过,但是差不多)

相关推荐

    Java并发编程从入门到精通(pdf)(附源码)

    通过这些内容的学习,读者可以掌握高效并发编程技巧,减少线程间的交互,提高程序的并行度。 Java内存模型(JMM)是并发编程中的核心概念,书中会详细解析其工作原理,包括volatile、final关键字的作用,以及 ...

    Java并发编程从入门到精通源码.rar

    Java并发编程是Java开发中的重要领域,特别是在大型分布式系统、多线程应用和服务器端程序设计中不可或缺。这个资源包“Java并发编程从入门到精通源码.rar”显然是为了帮助开发者深入理解并掌握这一关键技能。它包含...

    java并发编程从入门到精通

    《Java并发编程从入门到精通》作者结合自己10多年Java并发编程经验,详细介绍了Java并发编程的基础概念、工作原理、编程技巧和注意事项,对Java高性能高并发编程有极大的参考价值。 《Java并发编程从入门到精通》...

    C#并发编程入门教程之概述

    C#并发编程入门教程概述 本文主要介绍了C#并发编程的相关知识,涵盖了并发编程的概念、多线程、并行编程、异步编程等方面的内容,并通过示例代码详细介绍了每个方面的实现细节,对C#开发人员具有一定的参考学习价值...

    实战Java高并发程序设计课-视频教程网盘链接提取码下载.txt

    实战Java高并发程序设计课是一门针对Java开发者的培训课程,重点关注如何设计和优化高并发的程序。学员将学习到并发编程的基本概念、线程池的使用、锁机制、并发集合等技术,并通过实际案例进行实践操作。这门课程...

    Java并发程序入门介绍

    在Java编程中,并发程序设计是一项关键技能,尤其是在多核处理器和高并发需求的现代软件系统中。本文将深入探讨Java并发程序的入门知识,包括线程的创建、线程优先级以及线程池的使用。 首先,让我们从创建线程开始...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段24讲、线程间通信快速入门,使用wait和notify进行线程间的数据通信.mp4 │ 高并发编程第一阶段25讲、多Produce多Consume之间的通讯导致出现程序假死的原因分析.mp4 │ 高并发编程第一阶段26...

    C++ 并发编程中文版

    std::thread 的使用是并发编程的入门级知识点,它是学习其他并发特性的基础。 接着,多线程编程中避免不了对共享数据的访问。线程间共享数据时必须采取适当的同步机制,否则可能会导致数据竞争、条件竞争等一系列...

    java7hashmap源码-java-concurrency-programming:java并发编程入门

    java并发编程入门 基本概念 并发: 同时拥有俩个或者多个线程,如果线程在单核处理器上运行,多个线程将交替的换入或者换出内存,这些线程是同时 "存在" 的,每个线程都处于执行过程中的某个状态,如果运行在多核...

    Java并发编程线程入门简介.pdf

    10. **并发模式**:Java并发编程还包括多种设计模式,如生产者消费者模型、读写锁模式、守护线程模式等,这些模式可以帮助开发者设计出高效且健壮的并发程序。 以上就是Java并发编程线程的基础知识,理解并熟练掌握...

    java并发编程-从入门到精通

    本教程“java并发编程-从入门到精通”旨在帮助你深入理解这个领域,并逐步提升你的编程能力。 首先,我们要理解Java并发的基础概念。并发是指一个程序中同时执行的多个线程,这在多核或多处理器系统中尤为常见。...

    java:并发编程的两本书《Java并发编程实战》 《Java并发编程的艺术》 PDF

    《Java并发编程实战》是Java并发编程领域的经典之作,由Brian Goetz等Java并发领域的权威专家共同撰写。本书自2012年出版以来,深受全球Java开发者的喜爱与推崇,被誉为Java并发编程的必读佳作。它不仅深入浅出地...

    java从入门到精通之高并发系列

    本篇文章将详细解析"java从入门到精通之高并发系列"这一主题,涵盖高并发编程的基本概念、核心技术和实战策略。 一、高并发概述 高并发是指在短时间内大量用户同时访问系统,对系统的处理能力提出了极高的要求。...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第一阶段24讲、线程间通信快速入门,使用wait和notify进行线程间的数据通信.mp4 │ 高并发编程第一阶段25讲、多Produce多Consume之间的通讯导致出现程序假死的原因分析.mp4 │ 高并发编程第一阶段26...

    java多线程视频教程(共七套)

    01、【中级原理】java多线程并发编程入门原理精通视频教程 02、【中级原理专题】java并发编程多线程高级专题课程 03. 【中级原理】高并发编程原理和线程池精通教程 04、【高级原理】Java并发多线程编程基础原理与...

    Java并发编程线程入门简介[借鉴].pdf

    总的来说,Java并发编程线程入门需要理解进程和线程的概念,熟悉线程的创建与管理,掌握线程同步和互斥的机制,以及如何处理线程中断和异常。随着Java并发库的不断发展,开发者现在有更多的工具和策略来解决并发问题...

Global site tag (gtag.js) - Google Analytics