zoukankan      html  css  js  c++  java
  • 控制线程同时运行数量

    package com.dwz.concurrency.chapter9;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.LinkedList;
    import java.util.List;
    import java.util.Optional;
    
    public class CaptureService {
        private final static LinkedList<Control> CONTROLS = new LinkedList<>();
        private final static int MAX_WORKER = 5;
        
        private static Thread createCaptureThread(String name) {
            return new Thread(() -> {
                Optional.of("The worker ["+Thread.currentThread().getName()+"] begin capture data").ifPresent(System.out::println);
                synchronized (CONTROLS) {
                    while (CONTROLS.size() >= MAX_WORKER) {
                        try {
                            CONTROLS.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    CONTROLS.addLast(new Control());
                }
                
                Optional.of("The worker ["+Thread.currentThread().getName()+"] is working..").ifPresent(System.out::println);
                try {
                    Thread.sleep(10_000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                
                synchronized (CONTROLS) {
                    Optional.of("The worker ["+Thread.currentThread().getName()+"] End capture data.., CONTROLS size is "+CONTROLS.size()).ifPresent(System.out::println);
                    CONTROLS.removeFirst();
                    CONTROLS.notifyAll();
                }
            }, name) ;
        }
        public static void main(String[] args) {
            List<Thread> worker = new ArrayList<>();
            Arrays.asList("M1", "M2", "M3", "M4", "M5", "M6", "M7", "M8", "M9", "M10", "M11", "M12", "M13")
                    .stream()
                    .map(CaptureService :: createCaptureThread)
                    .forEach(t -> {
                        t.start();
                        worker.add(t);
                    });
            worker.stream().forEach(t -> {
                try {
                    t.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
            
            Optional.of("All of capture work finished").ifPresent(System.out::println);
        }
        
        private static class Control {}
    }

    测试结果,同一时间里实际上始终最多有5个线程同时运行

  • 相关阅读:
    Map
    input输入框文字提示IE兼容
    Linux下实现获取远程机器文件
    ssl_error_rx_record_too_long
    Linux下访问网站
    Linux安装Jdk1.7
    bootstrap左右圆角按钮-适配手机页面
    jQuery使用load方法加载其他文档内容
    Js操作DOM小练习_01
    BootstrapValidator验证表单用法
  • 原文地址:https://www.cnblogs.com/zheaven/p/12067378.html
Copyright © 2011-2022 走看看