zoukankan      html  css  js  c++  java
  • 开启9个线程执行任务,但是同时只能有3个线程处于可运行状态,其余的暂时处于阻塞状态

    开启了9个线程分别取去执行任务,但同时只能有3个线程处于运行中,其余的处于block状态,等某个线程运行完后,再将block状态的线程唤醒去执行,直到所有的任务执行完成,这样做的一个原因是当系统中有大量线程,比如有10000个线程在运行时,CPU在线程之间切换可能导致效率很低,我只让有限的线程比如10个线程运行,减少线程间切换,可以提高效率。要求不使用线程池实现

    public class Test {
        //CONTROLS锁
        final static private LinkedList<Control> CONTROLS = new LinkedList<>();
        private final static int MAX_WORKER = 2;
    
        public static void main(String[] args) {
    
            List<Thread> worker = new ArrayList<>();
            Arrays.asList("T1", "T2", "T3", "T4", "T5", "T6", "T7", "T8", "T9").stream()
                    .map(Test::createCaptureThread).forEach(t -> {
                        t.start();
                        worker.add(t);
                    });
    
            worker.stream().forEach(t -> {
                try {
                    t.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
            System.out.println("All of capture work finished");
        }
    
        private static Thread createCaptureThread(String name) {
            return new Thread(() -> {
                System.out.println("The worker 【" + Thread.currentThread().getName() + " 】 BEGIN capture data ");
                synchronized (CONTROLS) {
                    while (CONTROLS.size() >  MAX_WORKER) {
                        try {
                            CONTROLS.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    CONTROLS.addLast(new Control());
                }
                System.out.println("The worker 【" + Thread.currentThread().getName() + " 】  is working ...");
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    
                synchronized (CONTROLS) {
                    System.out.println("The worker 【" + Thread.currentThread().getName() + " 】  END capture data ");
                    CONTROLS.removeFirst();
                    CONTROLS.notifyAll();
                }
            }, name);
        }
    
        private static class Control {
        }
    }
  • 相关阅读:
    巧用table的rules属性设置表格的边框掩饰。。。
    JS日期和时间
    onchange事件验证文本框格式,不正确光标返回原文本框,这个js怎么写?
    简易万用表
    在单片机中的空函数
    地感线圈的讲究
    全桥片
    这个当单片机程序怎么会不停的通过串口发数据,设置波特率为9600,但是串口软件接受数据不对(初学者,请高手指教)
    今天开博
    关于二极管
  • 原文地址:https://www.cnblogs.com/moris5013/p/10717422.html
Copyright © 2011-2022 走看看