Heim  >  Fragen und Antworten  >  Hauptteil

java - 控制并发线程数

高洛峰高洛峰2762 Tage vor937

Antworte allen(2)Ich werde antworten

  • 怪我咯

    怪我咯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)个线程在运行。

    Antwort
    0
  • PHPz

    PHPz2017-04-18 10:48:36

    用CountDownLatch。。。

    Antwort
    0
  • StornierenAntwort