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


运行结果如下:


猜你喜欢

转载自blog.csdn.net/qq_25646191/article/details/80425741
今日推荐