Java多執行緒demo
阿新 • • 發佈:2019-02-19
demo程式碼如下:
package com.test; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * 多執行緒demo示例 * @since 2018-05-22 * @version 1.0 */ public class MultThreadDemo { public static void main(String[] args) throws InterruptedException { long start = System.currentTimeMillis(); int jobs = 10;//假設一個任務需要10個job //固定個數的執行緒池 ExecutorService service = Executors.newFixedThreadPool(jobs); //每個job結束時,則報告一下結束,所有job都結束時,則任務結束 CountDownLatch latch = new CountDownLatch(jobs); for(int i=0;i<jobs;i++){//準備執行 Job job = new Job("job"+i,latch); service.submit(job); } //等待所有job結束 latch.await(); //注意:此時main執行緒已經要結束了,但是service執行緒如果不關閉是不會結束的 service.shutdown(); long end = System.currentTimeMillis(); System.out.println(">>>>>>>>任務總耗時"+(end-start)+"ms"); } } /** * job類 */ class Job implements Runnable { /** * job名稱 */ private String jobName; /** * 同步計數器(倒數計數鎖:當倒數到0時觸發事件,也就是開鎖,其他人就可以進入了。) */ private CountDownLatch latch; /** * 建構函式 * @param jobName job名稱 * @param latch 同步計數器 */ public Job(String jobName,CountDownLatch latch){ this.jobName = jobName; this.latch = latch; } @Override public void run() { try { System.out.println(jobName+" has start..."); long useTime = (long)(Math.random()*1000); Thread.sleep(useTime);//模擬job需要的時間 System.out.println(jobName+" has finished,useTime="+useTime); } catch (InterruptedException e) { e.printStackTrace(); } finally { latch.countDown();//報告job結束了 } } }
執行結果如下: