概述
有一个网站列表,我们分别使用单线程和多线程来测试这个网站是否允许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包实现多线程开发所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复