import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.text.NumberFormat;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* java模拟多线程高并发
* @author Administrator
*
*/
public class MultiThreadProxyHubApiTest {
static int count = 0;
// 总访问量是clientNum,并发量是threadNum
int threadNum = 2;
int clientNum = 2;
float avgExecTime = 0;
float sumexecTime = 0;
long firstExecTime = Long.MAX_VALUE;
long lastDoneTime = Long.MIN_VALUE;
float totalExecTime = 0;
public static void main(String[] args) {
new MultiThreadProxyHubApiTest().run();
System.out.println("finished!");
}
public void run() {
final ConcurrentHashMap<Integer, ThreadRecord> records = new ConcurrentHashMap<Integer, ThreadRecord>();
// 建立ExecutorService线程池,threadNum个线程可以同时访问
ExecutorService exec = Executors.newFixedThreadPool(threadNum);
// 模拟clientNum个客户端访问
final CountDownLatch doneSignal = new CountDownLatch(clientNum);
for (int i = 0; i < clientNum; i++) {
Runnable run = new Runnable() {
public void run() {
int index = getIndex();
long systemCurrentTimeMillis = System.currentTimeMillis();
try {
sendGet("http://localhost:9937/tcmp-management/disclosureProcess/syn");
System.out.println(System.currentTimeMillis()/* + sendGet*/);
} catch (Exception e) {
e.printStackTrace();
}
records.put(index, new ThreadRecord(systemCurrentTimeMillis, System.currentTimeMillis()));
doneSignal.countDown();// 每调用一次countDown()方法,计数器减1
}
};
exec.execute(run);
}
try {
// 计数器大于0 时,await()方法会阻塞程序继续执行
doneSignal.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
/**
* 获取每个线程的开始时间和结束时间
*/
for (int i : records.keySet()) {
ThreadRecord r = records.get(i);
sumexecTime += ((double) (r.endTime - r.startTime)) / 1000;
if (r.startTime < firstExecTime) {
firstExecTime = r.startTime;
}
if (r.endTime > lastDoneTime) {
this.lastDoneTime = r.endTime;
}
}
this.avgExecTime = this.sumexecTime / records.size();
this.totalExecTime = ((float) (this.lastDoneTime - this.firstExecTime)) / 1000;
NumberFormat nf = NumberFormat.getNumberInstance();
nf.setMaximumFractionDigits(4);
System.out.println("======================================================");
System.out.println("线程数量:\t\t" + threadNum);
System.out.println("客户端数量:\t" + clientNum);
System.out.println("平均执行时间:\t" + nf.format(this.avgExecTime) + "秒");
System.out.println("总执行时间:\t" + nf.format(this.totalExecTime) + "秒");
System.out.println("吞吐量:\t\t" + nf.format(this.clientNum / this.totalExecTime) + "次每秒");
}
public static int getIndex() {
return ++count;
}
/**
* 向指定URL发送GET方法的请求
*
* @param url
* 发送请求的URL
* @param param
* 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
* @return URL 所代表远程资源的响应结果
*/
public static String sendGet(String url) {
String result = "";
BufferedReader in = null;
try {
String urlNameString = url;
URL realUrl = new URL(urlNameString);
// 打开和URL之间的连接
URLConnection connection = realUrl.openConnection();
// 设置通用的请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 建立实际的连接
connection.connect();
// 获取所有响应头字段
Map<String, List<String>> map = connection.getHeaderFields();
// 遍历所有的响应头字段
for (String key : map.keySet()) {
System.out.println(key + "--->" + map.get(key));
}
// 定义 BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
System.out.println("发送GET请求出现异常!" + e);
e.printStackTrace();
}
// 使用finally块来关闭输入流
finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return result;
}
}
class ThreadRecord {
long startTime;
long endTime;
public ThreadRecord(long st, long et) {
this.startTime = st;
this.endTime = et;
}
}