首頁  >  問答  >  主體

java - 控制并发线程数

高洛峰高洛峰2711 天前892

全部回覆(2)我來回復

  • 怪我咯

    怪我咯2017-04-18 10:48:36

    如果你了解信號量的實現機制,那麼這題目也是一個意思。

    public class Test {
    
        private final Integer maxCounter = 3;
        private Integer current = 0;
    
        public void call1() {
            //在这里补充代码
            synchronized (this) {
                try {
                    while (current.equals(maxCounter)) { // 请求 到达上限
                        wait();
                    }
                } catch (InterruptedException ex) {
                }
                current++;
                notifyAll();
            }
    
            call2(current);
    
            synchronized (this) {
                try {
                    while (current == 0) {
                        wait();
                    }
                } catch (InterruptedException ex) {
                }
                current--;
                notifyAll();
            }
        }
    
        private void call2(Integer current) {
    
            System.out.println(Thread.currentThread().getName() + ": I'm called " + current);
    
            // 下面的休眠 2 秒钟用于测试
            try {
                Thread.sleep(2000);
            } catch (InterruptedException ex) {
                ex.printStackTrace(System.err);
            }
        }
    
        static class TestThread implements Runnable {
    
            private Test t;
    
            public TestThread(Test t) {
                this.t = t;
            }
    
            @Override
            public void run() {
                t.call1();
            }
        }
    
        public static void main(String[] args) {
            Test t1 = new Test();
            TestThread tt = new TestThread(t1);
            for (int i = 0; i < 10; i++) {
                Thread t = new Thread(tt, "Thread-" + i);
                t.start();
            }
        }
    }

    運行這段程式碼,你可以發現每 2 秒內,最多只有 3 (maxCounter)個執行緒在運行。

    回覆
    0
  • PHPz

    PHPz2017-04-18 10:48:36

    用CountDownLatch。 。 。

    回覆
    0
  • 取消回覆