1. 程式人生 > >Java多執行緒demo

Java多執行緒demo

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結束了    
         }
	}
	
}

執行結果如下: