您的位置:首页 > 其它

多线程线程池控制一个方法的并发量 限制只有5个线程执行任务

2016-06-17 15:04 495 查看
方法1:

public class ThreadPoolTest {

/**
* 信息量
*/
private static Semaphore semaphore = new Semaphore(5);//相当于放了5把锁

public static void main(String[] args) {

for (int i = 0; i < 100; i++) {
new Thread(new Runnable() {

@Override
public void run() {
try {
method();
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();

}

}

private static  void method() throws Exception {

semaphore.acquire(); //让这个方法获得一把锁

System.out.println(Thread.currentThread().getName() + "进来了");

Thread.sleep(500);

System.out.println("...." + Thread.currentThread().getName() + "出去了...");

semaphore.release();//用完之后释放
}

}


方法2:

public class ThreadPoolTest2 {
    
    public static void main(String[] args) {

        BlockingQueue<Runnable> blockingQueue = new LinkedBlockingDeque<Runnable>(50);
        /*
         * 参数1:核心池个数   
         * 参数2:最大线程池个数
         * 参数3:任务执行完后 核心线程池以外的线程销毁时间
         * 参数3:时间单位
         * 参数5:储存任务的任务队列  
         * 参数6:线程工厂
         */
        ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(5, 10, 1, TimeUnit.SECONDS, blockingQueue, new ThreadFactory() {
        
        //一个提供原子操作的Integer的类 i++线程不安全
        AtomicInteger atomicInteger = new AtomicInteger(0);
        
        @Override
        public Thread newThread(Runnable r) {
            
            //把任务r给新创建的线程
            Thread thread = new Thread(r);
            //给线程设置名称
            thread.setName("MyThread:"+ atomicInteger.getAndIncrement());
            return thread;
        }
        });
        
        
        //如果执行的任务大于  存储任务队列的个数+最大线程池个数 就会抛出java.util.concurrent.RejectedExecutionException异常
        for (int i = 0; i < 110; i++) {
            poolExecutor.execute(new Runnable() {
                
                @Override
                public void run() {
                    try {
                        method();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }

    }

    
    private static void method() throws Exception {
        
        System.out.println(Thread.currentThread().getName() + "进来了");

        Thread.sleep(200);

        System.out.println("...." + Thread.currentThread().getName() + "出去了...");
    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: