search

Home  >  Q&A  >  body text

java - 控制并发线程数

高洛峰高洛峰2802 days ago978

reply all(2)I'll reply

  • 怪我咯

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

    If you understand the implementation mechanism of semaphore, then this question also has the same meaning.

    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();
            }
        }
    }

    Run this code, you can find that only 3 (maxCounter) threads are running at most every 2 seconds.

    reply
    0
  • PHPz

    PHPz2017-04-18 10:48:36

    Use CountDownLatch. . .

    reply
    0
  • Cancelreply