日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java callback 多线程_JAVA Callback效率测试

發(fā)布時間:2025/3/12 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java callback 多线程_JAVA Callback效率测试 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在最近的聯(lián)網(wǎng)電商項目中,想要實現(xiàn)單個web容器內(nèi)的支付請求,全部能夠統(tǒng)一宏觀上同步,實現(xiàn)粒度上面異步,找來找去,沒有相關(guān)方面的框架或者方案,于是最后基于現(xiàn)實場景,打算使用Java callback 的多線程方式,假象偽并發(fā)量為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;

/**

* 線程類構(gòu)造函數(shù),傳入線程序號

* @param taskNum

*/

public MyCallable(A obj)

{

this.setObj(obj);

}

/**

* 重寫接口的方法,子線程調(diào)用

* 此方法是生成0-99的數(shù)字,(百位表示子線程序號)用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() + "任務(wù)時間【" + time + "毫秒】");

return this.getObj();

}

public A getObj()

{

return obj;

}

public void setObj(A obj)

{

this.obj = obj;

}

/**

* @author gyx

*主線程調(diào)用

*/

public class Test

{

public static void main(String[] args) throws InterruptedException, ExecutionException

{

try

{

System.out.println("----程序開始運行----");

Date date1 = new Date();

int taskSize = 100000;

// 創(chuàng)建一個線程池

// ? ? ? ? ? ?ExecutorService pool = Executors.newFixedThreadPool(4);

ExecutorService pool = Executors.newCachedThreadPool();

// 創(chuàng)建多個有返回值的任務(wù)

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));

// 執(zhí)行任務(wù)并獲取Future對象

Future f = pool.submit(c);

System.out.println("get-result----------------------" + f.get().getId());

list.add(f);

}

// 關(guān)閉線程池

pool.shutdown();

Date date2 = new Date();

System.out.println("----程序結(jié)束運行----,程序運行時間【" ? + (date2.getTime() - date1.getTime()) + "毫秒】");

// 獲取所有并發(fā)任務(wù)的運行結(jié)果

// ? ? ? ? ?for (Future f : list)

// ? ? ? ? ?{

// ? ? ? ? ? ? ?// 從Future對象上獲取任務(wù)的返回值,并輸出到控制臺

// ? ? ? ? ? ? ?System.out.println("get-result----------------------" + f.get().getId());

// ? ? ? ? ?}

}

catch(Exception e)

{

e.printStackTrace();

System.exit(0);

}

finally

{

System.exit(0);

}

}

}

結(jié)果為:----程序結(jié)束運行----,程序運行時間【26351毫秒】

調(diào)整線程池:

ExecutorService pool = Executors.newFixedThreadPool(2);

結(jié)果為:----程序結(jié)束運行----,程序運行時間【17128毫秒】

調(diào)整線程池:

ExecutorService pool = Executors.newFixedThreadPool(1);

結(jié)果為:程序運行時間【16269毫秒】

結(jié)論:newCachedThreadPool 效率最差,線程數(shù)小于cpuh核心 2/1 效率相對高,代價也比較平穩(wěn),處理當(dāng)下假想,基本滿足要求。

總結(jié)

以上是生活随笔為你收集整理的java callback 多线程_JAVA Callback效率测试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。