读书人

线程的数量统制

发布时间: 2012-08-26 16:48:06 作者: rapoo

线程的数量控制
在编程中,往往都需要采用线程来提高速度,但线程并不是越多越好。
1. 线程越多,JVM 所占资源越多
2. 线程越多,越容易造成资源冲突,如果处理不当,造成死锁。
所以,在启动线程的时候要根据应用程序的特点限制线程的数量。
本程序采用了java.util.concurrent的锁进行线程数量控制,测试代码如下:

/** * 专注互联网,分享创造价值 *  maoxiang@gmail.com */package cn.jteam.app.taobao.spider;import java.net.InetAddress;import java.util.concurrent.CountDownLatch;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * *  作用: */public class TestThreadLock {       private Lock lock = new ReentrantLock();    final Condition full = lock.newCondition();    final CountDownLatch startSignal = new CountDownLatch(1);    private int threads;    CountDownLatch signal = new CountDownLatch(5);    public void addThreads() throws Exception {        lock.lock();        try {            if (threads > 5) {                full.await();            }            threads++;        } finally {            lock.unlock();        }    }    public void removeThreads() {        lock.lock();        try {            if (threads <= 5) {                full.signal();            }            threads--;        } finally {            lock.unlock();        }    }    /**     * 测试线程     * @throws Exception     */    public void run() throws Exception {        for (int i = 0; i < 10; i++) {            addThreads();            final int j = i;            (new Thread() {                @Override                public void run() {                    try {                        sleep(500);                        System.out.println("current " + j + "=" + threads);                    } catch (Exception e) {                        e.printStackTrace();                    } finally {                        removeThreads();                        if (threads == 0) {                            startSignal.countDown();                        }                    }                }            }).start();        }        startSignal.await();    }    public static void main0(String[] args) throws Exception {        System.out.println("begin");        TestThreadLock test = new TestThreadLock();        test.run();        System.out.println("end..........");    }     }

输入结果为:
begin
current 1=6
current 0=6
current 5=5
current 3=4
current 4=4
current 2=4
current 7=4
current 6=3
current 8=3
current 9=3
end..........


这个程序里,限制了线程的数量为5,但线程超过5个时,就排队等待。

读书人网 >编程

热点推荐