利用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的使用效率。

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值