我是靠谱客的博主 缥缈鸵鸟,最近开发中收集的这篇文章主要介绍利用java.util.concurrent包实现多线程开发,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

有一个网站列表,我们分别使用单线程和多线程来测试这个网站是否允许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的使用效率。

 

 

 

 

 

 

最后

以上就是缥缈鸵鸟为你收集整理的利用java.util.concurrent包实现多线程开发的全部内容,希望文章能够帮你解决利用java.util.concurrent包实现多线程开发所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部