java callback 多线程_JAVA Callback效率测试
在最近的聯網電商項目中,想要實現單個web容器內的支付請求,全部能夠統一宏觀上同步,實現粒度上面異步,找來找去,沒有相關方面的框架或者方案,于是最后基于現實場景,打算使用Java callback 的多線程方式,假象偽并發量為100000
/**
*
* @author gyx
*
*/
public class A
{
private double ?id = 0;
public A(double ?id)
{
this.setId(id);
}
public double ?getId()
{
return id;
}
public void setId(double ?id)
{
this.id = id;
}
/**
* 線程類
* @author gyx
*
*/
public class MyCallable implements Callable
{
private A obj;
/**
* 線程類構造函數,傳入線程序號
* @param taskNum
*/
public MyCallable(A obj)
{
this.setObj(obj);
}
/**
* 重寫接口的方法,子線程調用
* 此方法是生成0-99的數字,(百位表示子線程序號)用list返回
*/
public A call() throws Exception
{
Date dateTmp1 = new Date();
System.out.println("business_start.............and------begin" + this.getObj().getId());
this.getObj().setId(Math.random() * 1000000000);
Date dateTmp2 = new Date();
long time = dateTmp2.getTime() - dateTmp1.getTime();
System.out.println("線程" + Thread.currentThread().getId() + "任務時間【" + time + "毫秒】");
return this.getObj();
}
public A getObj()
{
return obj;
}
public void setObj(A obj)
{
this.obj = obj;
}
/**
* @author gyx
*主線程調用
*/
public class Test
{
public static void main(String[] args) throws InterruptedException, ExecutionException
{
try
{
System.out.println("----程序開始運行----");
Date date1 = new Date();
int taskSize = 100000;
// 創建一個線程池
// ? ? ? ? ? ?ExecutorService pool = Executors.newFixedThreadPool(4);
ExecutorService pool = Executors.newCachedThreadPool();
// 創建多個有返回值的任務
List> list = new ArrayList>();
for (int i = 0; i < taskSize; i++)
{
System.out.println("the current ?is ............" + i);
Callable c = new MyCallable(new A(0));
// 執行任務并獲取Future對象
Future f = pool.submit(c);
System.out.println("get-result----------------------" + f.get().getId());
list.add(f);
}
// 關閉線程池
pool.shutdown();
Date date2 = new Date();
System.out.println("----程序結束運行----,程序運行時間【" ? + (date2.getTime() - date1.getTime()) + "毫秒】");
// 獲取所有并發任務的運行結果
// ? ? ? ? ?for (Future f : list)
// ? ? ? ? ?{
// ? ? ? ? ? ? ?// 從Future對象上獲取任務的返回值,并輸出到控制臺
// ? ? ? ? ? ? ?System.out.println("get-result----------------------" + f.get().getId());
// ? ? ? ? ?}
}
catch(Exception e)
{
e.printStackTrace();
System.exit(0);
}
finally
{
System.exit(0);
}
}
}
結果為:----程序結束運行----,程序運行時間【26351毫秒】
調整線程池:
ExecutorService pool = Executors.newFixedThreadPool(2);
結果為:----程序結束運行----,程序運行時間【17128毫秒】
調整線程池:
ExecutorService pool = Executors.newFixedThreadPool(1);
結果為:程序運行時間【16269毫秒】
結論:newCachedThreadPool 效率最差,線程數小于cpuh核心 2/1 效率相對高,代價也比較平穩,處理當下假想,基本滿足要求。
總結
以上是生活随笔為你收集整理的java callback 多线程_JAVA Callback效率测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 799页!吴恩达深度学习笔记.PDF
- 下一篇: 上海女博士“择偶条件”惹争议,相亲像是在