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

利用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的时间和程序实际的执行时间没有关系。。。

相关推荐

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

    java.util.concurrent-多线程框架

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

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

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

    除了具有很好的并发性的Collections,java.util.concurrent还引入了其他一些预先构建的组件,它们可帮助您调整和执行多线程应用程序中的线程。

    Redis客户端Redisson.zip

    java.util.concurrent.CountDownLatch通过org.redisson.core.RTopic 实现分布式订阅/发布通过 org.redisson.core.RHyperLogLog 实现分布式HyperLogLog 线程安全支持 OSGi超过110个单元测试 标签:Redisson...

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

    NULL 博文链接:https://janeky.iteye.com/blog/769965

    JAVA_API1.6文档(中文)

    java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 ...

    java多线程并发编程例子

    关于java.util.concurrent多线程核心包内各种线程资源的使用场景例子

    java 多线程同步

    不客气地说,创建 java.util.concurrent 的目的就是要实现 Collection 框架对数据结构所执行的并发操作。通过提供一组可靠的、高性能并发构建块,开发人员可以提高并发类的线程安全、可伸缩性、性能、可读性和可靠性...

    浅谈java.util.concurrent包中的线程池和消息队列

    主要介绍了浅谈java.util.concurrent包中的线程池和消息队列,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    JavaAPI中文chm文档 part2

    java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 ...

    java api最新7.0

    java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR ...

    Java 1.6 API 中文 New

    java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR ...

    [Java参考文档].JDK_API 1.6

    java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR ...

    JavaAPI1.6中文chm文档 part1

    java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 ...

    java jdk-api-1.6 中文 chmd

    java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 ...

    多线程,高并发.pdf

    1. stop() 和 suspend() 方法为何不推荐使用? 2. sleep() 和 wait() 有什么区别? 3. 同步和异步有何异同,...5. 简述 synchronized 和 java.util.concurrent.locks.Lock 的异同? 6. 概括的解释下线程的几种可用状态。

    [Java参考文档]

    java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 ...

    Java理论与实践:并发在一定程度上使一切变得简单

    它们是许多多线程应用程序的基本构件的高性能实现,并经历了大量测试。util.concurrent是JSR 166的切入点,它将带来一组并发性的实用程序,这些实用程序将成为 JDK 1.5中的java.util.concurrent包,但您不必等到那时...

    Java基础知识点总结.docx

    无论是工作学习,不断的总结是必不可少的。只有不断的总结,发现问题,弥补不足,才能长久的...java.util.concurrent.locks包下常用的类 326 NIO(New IO) 327 volatile详解 337 Java 8新特性 347 Java 性能优化 362

Global site tag (gtag.js) - Google Analytics