`
xiaobian
  • 浏览: 587941 次
  • 来自: 北京
社区版块
存档分类
最新评论

利用java.util.concurrent包实现多线程开发

    博客分类:
  • Java
阅读更多

有一个网站列表,我们分别使用单线程和多线程来测试这个网站是否允许Ping,既是否ping这些网站能得到回应。

 

单线程,与使用了线程池的多线程之间的对比:

 

package com.concurrent.demo;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class TestThreadPool {
	public static long pingWithThreadPool() throws InterruptedException {
		// 创建已有10个固定线程的线程池
		ExecutorService exec = Executors.newFixedThreadPool(10);
		// 开始计时
		long startTime = System.currentTimeMillis();
		List list = getSites();
		for (int i = 0; i < list.size(); i++) {
			final String ip = list.get(i).toString();
			Runnable task = new Runnable() {
				public void run() {
					ping(ip);
				}
			};
			// 往线程池中添加任务,线程开始处理这些任务
			exec.execute(task);
		}
		// 关闭线程池,不会阻塞主线程的执行【这里是main线程】
		exec.shutdown();
		// main线程暂停执行一段时间,等待线程池中的任务执行完毕
		Thread.currentThread().sleep(1000 * 25);
		// 由于无法准确统计多线程的执行时间,这个是一个大概的执行时间。
		// 实际开发中无意义。
		return (System.currentTimeMillis() - startTime);
	}

	/*
	 * 或得要操作的网站列表
	 */
	public static List getSites() {
		List list = new ArrayList();
		list.add("www.sina.com.cn");
		list.add("www.sohu.com");
		list.add("www.google.com");
		list.add("www.baidu.com");
		list.add("www.163.com");
		list.add("www.yahoo.com");
		list.add("xiaobian.iteye.com");
		list.add("www.iteye.com");
		list.add("www.chinaunix.net");
		list.add("www.topswim.net");
		return list;
	}

	/*
	 * 单线程的方式来进行操作
	 * 
	 */
	public static long pingWithOutThread() {
		long startTime = System.currentTimeMillis();
		List list = getSites();
		for (int i = 0; i < list.size(); i++) {
			ping(list.get(i).toString());
		}
		return (System.currentTimeMillis() - startTime);// 统计整个操作消费的时间
	}

	public static void main(String args[]) throws InterruptedException {
		System.out.println(pingWithThreadPool() / 1000 + "s");
		System.out.println("\n----------------------------\n");
		System.out.println(pingWithOutThread() / 1000 + "s");
	}

	/*
	 * 调用系统命令ping来判断某个网站是否允许ping
	 */
	private static void ping(String ip) {
		Runtime rt = Runtime.getRuntime();
		try {
			Process p = rt.exec("ping   " + ip);
			BufferedReader bufferedReader = new BufferedReader(
					new InputStreamReader(p.getInputStream()));
			StringBuffer sb = new StringBuffer();
			String s = null;
			while ((s = bufferedReader.readLine()) != null) {
				sb.append(s);
				sb.append(" ");
			}
			// System.out.println(sb.toString());
			if (sb.toString().indexOf("Sent = 4, Received = 4") > -1) {
				System.out.println(ip + " be pinged is ok");
			} else
				System.out.println(ip + " be pinged  not ok");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			rt.gc();// 强制回收
		}

	}
}

 

 

执行结果:

【多线程】

www.topswim.net be pinged is ok
xiaobian.iteye.com be pinged  not ok
www.iteye.com be pinged  not ok
www.163.com be pinged is ok
www.yahoo.com be pinged is ok
www.google.com be pinged is ok
www.baidu.com be pinged is ok
www.chinaunix.net be pinged is ok
www.sina.com.cn be pinged is ok
www.sohu.com be pinged  not ok
25s

----------------------------
【单线程】
www.sina.com.cn be pinged is ok
www.sohu.com be pinged  not ok
www.google.com be pinged is ok
www.baidu.com be pinged is ok
www.163.com be pinged is ok
www.yahoo.com be pinged is ok
xiaobian.iteye.com be pinged  not ok
www.iteye.com be pinged  not ok
www.chinaunix.net be pinged is ok
www.topswim.net be pinged is ok
57s

 

有结果可以看到多线程的执行速度比单线程快乐一倍还多。所以在合适的地方使用多线程可以加快程序的执行速度。

 

多线程的使用是充分提交CPU的使用效率。

 

 

 

 

 

 

分享到:
评论
1 楼 flybear_chf 2012-06-14  
Thread.currentThread().sleep(1000 * 25); 
25s
这个输出的其实是你sleep的时间和程序实际的执行时间没有关系。。。

相关推荐

    Tomcat内存溢出的解决方法(java.util.concurrent.ExecutionException)

    在Java应用服务器中,Tomcat是一个非常常见的轻量级选择,尤其在开发和部署Web应用程序时。然而,如同任何其他程序一样,Tomcat也可能遇到内存管理问题,导致内存溢出。"java.util.concurrent.ExecutionException: ...

    Java高性能线程库(java.util.concurrent包的补充)

    一个高性能的Java线程库,该库是 JDK 1.5 中的 java.util.concurrent 包的补充,可用于基于并发消息机制的应用。该类库不提供远程的消息功能,其设计的宗旨是实现一个内存中的消息传递机制. 主要特点有: * All ...

    java并发工具包 java.util.concurrent中文版pdf

    为了简化并发编程的复杂性,Java 5 引入了 `java.util.concurrent` 包,提供了一系列强大的类和接口,帮助开发者更高效地管理多线程任务。 #### 二、`java.util.concurrent` 概览 `java.util.concurrent` 包提供了...

    java.util.concurrent 学习ppt

    Java.util.concurrent是Java 5.0引入的一个重要包,它为多线程编程提供了一组高级并发工具。这个包的设计者是Doug Lea,它的出现是JSR-166的一部分,也被称作Tiger更新。Java.util.concurrent的引入是为了解决传统...

    java.util.concurrent-多线程框架.docx

    java.util.concurrent 多线程框架 java.util.concurrent 多线程框架是 Java 语言中用于多线程编程的库。该库提供了多种线程池实现、并发集合、同步器、lock 等多种机制,以便开发者更方便地编写高效、可靠的多线程...

    The java.util.concurrent Synchronizer Framework

    为了更好地支持并发编程,Java平台在J2SE 1.5版本中引入了`java.util.concurrent`包,这是一个包含了许多中级并发支持类的集合,通过Java社区过程(Java Community Process, JCP)的Java规范请求(Java ...

    JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用

    JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用是Java多线程编程中的一种重要概念。随着多线程编程的普及,线程池的使用变得越来越频繁。Java中的线程池是通过ThreadPoolExecutor类实现的。 一、...

    java.util.concurrent.uml.pdf

    标签“Java concurrent”是指这是一个关于Java并发编程的内容,这通常是面向希望开发多线程应用程序的Java开发者。并发编程允许程序同时处理多个任务,这对于多核心处理器和多处理器系统尤其重要。 文档的一部分...

    The java. util. concurrent synchronizer framework.pdf

    AQS(AbstractQueuedSynchronizer)是Java.util.concurrent包中同步器的基础框架,它的核心设计思想与实现方法在Doug Lea先生的这篇论文中有详细的介绍。论文详细阐述了AQS框架的原理、设计、实现、应用以及性能等...

    java.util.concurrent.ExecutionException 问题解决方法

    `java.util.concurrent.ExecutionException` 是Java并发编程中一个常见的异常,通常在执行Future对象的get()方法时抛出。这个异常表明在异步任务的执行过程中发生了异常。当我们使用ExecutorService提交任务并尝试...

    The java.util.concurrent synchronizer framework.pdf

    文档明确指出,Doug Lea为J2SE 5.0引入的java.util.concurrent包提供了一套精巧的同步器框架,这套框架极大地简化了并发控制的实现,并且在多个领域提供了高效的同步原语,如锁、条件变量、信号量、事件标志等。...

    java并发工具包 java.util.concurrent中文版-带书签版

    Java并发工具包(java.util.concurrent)是Java平台上用于高效、安全地处理多线程编程的重要组件。这个包包含了丰富的并发工具类,旨在帮助开发者构建高度并发的程序,提高程序的性能和可伸缩性。本资源是该工具包的...

    java多线程学习-java.util.concurrent详解(一) Latch/Barrier

    `java.util.concurrent`包是Java提供的一个强大的多线程工具库,其中包含了许多类和接口,如`CountDownLatch`和`CyclicBarrier`,它们为程序员提供了更高级别的同步和协调机制。这篇文档将详细解析这两个工具类的...

    java.util.concurrent_您不知道的5件事

    ### Java.util.concurrent_您不知道的5件事 #### 1. Semaphore(信号量) - **定义与作用**:`Semaphore` 类...无论是简单的信号量控制还是复杂的多线程同步逻辑,`java.util.concurrent` 包都能提供合适的解决方案。

    java_util_concurrent中文版pdf

    《Java Util Concurrent中文版》是Java并发编程领域的重要参考资料,主要涵盖了Java标准库中的`java.util.concurrent`包及其相关类和接口。这个包是Java多线程编程的核心,提供了高效、安全的并发工具,帮助开发者...

    java.util.concurrent 测试源文件

    Java.util.concurrent(JUC)是Java平台中的一个核心包,专门用于处理多线程并发问题。这个包包含了大量的工具类和接口,极大地简化了并发编程的复杂性,提高了程序的性能和可伸缩性。本测试源文件主要是针对JUC并发...

    深入Synchronized和java.util.concurrent.locks.Lock的区别详解

    Synchronized和java.util.concurrent.locks.Lock都是Java中用于实现线程同步的关键字和接口,它们的主要目标是保证多线程环境下的数据一致性与并发安全。然而,两者在使用方式、控制粒度以及灵活性方面存在显著差异...

    Java并发工具包java.util.concurrent用户指南中英文对照阅读版pdf

    Java并发工具包java.util.concurrent是Java平台在Java 5版本中引入的一组新的并发编程类库,旨在帮助Java开发者更容易地实现复杂的并发程序。这一包的出现,极大地简化了开发者在处理线程和数据同步时所遇到的难题,...

Global site tag (gtag.js) - Google Analytics