java多线程

两种简单的实现方式,一种是有链接阻塞队列,多余的任务会直接放到队列里面等待执行,一种是同步队列 

 public void testLinkedBlockingQueue(){
        List waitDealList = new ArrayList<>(10);
        for (int i = 0; i < 100; i++) {
            waitDealList.add(i);
        }
        // 创建一个同时允许线程并发执行的线程池,用于创建订单
        ExecutorService executor = new ThreadPoolExecutor(1, 10, 10L,
                TimeUnit.SECONDS, new LinkedBlockingQueue(10),
				new ThreadPoolExecutor.CallerRunsPolicy());
        for (Integer num : waitDealList) {
            Runnable runnable = () -> {
                System.out.println( Thread.currentThread().getName()+new Date()+":"+num);
                try {
                    sleep(1000);
                } catch (InterruptedException e) {
                    System.out.println(new Date()+":Thread.sleep exception:"+e.getMessage());
                    e.printStackTrace();
                }
            };
            executor.execute(runnable);
        }
        executor.shutdown();
        try {
            while (!executor.awaitTermination(3000, TimeUnit.MILLISECONDS)) {
                System.out.println(new Date()+":线程未关闭");
            }
            System.out.println(new Date()+":线程已关闭");
        } catch (InterruptedException e) {
            System.out.println(new Date()+":线程异常"+ e.getMessage());
        }
    }
public void testSynchronousQueue(){
        List waitDealList = new ArrayList<>(10);
        for (int i = 0; i < 100; i++) {
            waitDealList.add(i);
        }
        // 创建一个同时允许线程并发执行的线程池,用于创建订单
        ExecutorService executor = new ThreadPoolExecutor(1,20, 10L,
                TimeUnit.SECONDS, new SynchronousQueue(),
                new ThreadPoolExecutor.CallerRunsPolicy());
        for (Integer num : waitDealList) {
            Runnable runnable = () -> {
                System.out.println( Thread.currentThread().getName()+new Date()+":"+num);
                try {
                    sleep(1000);
                } catch (InterruptedException e) {
                    System.out.println(new Date()+":Thread.sleep exception:"+e.getMessage());
                    e.printStackTrace();
                }
            };
            executor.execute(runnable);
        }
        executor.shutdown();
        try {
            while (!executor.awaitTermination(3000, TimeUnit.MILLISECONDS)) {
                System.out.println(new Date()+":线程未关闭");
            }
            System.out.println(new Date()+":线程已关闭");
        } catch (InterruptedException e) {
            System.out.println(new Date()+":线程异常"+ e.getMessage());
        }
    }

 

你可能感兴趣的:(java多线程)