`
xylong
  • 浏览: 186912 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

话说并发工具类

 
阅读更多

并发编程,目前软件开发不可规避的一个问题,在此我先和大家分享下如何使用java 提供的并发工具类,至于内部源码原理研究还需要大家自己好好学习了,且下面的示例也是借鉴了别人文章,个人感觉蛮好。

 

1、Semaphore(信号量) ,主要做一些阀值的控制

public class SemaphoreTest {
	
	/**
	 * 适合做一些资源控制,下面的示例演示了在高并发来获取资源执行任务时,最多值允许
	 * 10个线程来执行任务,所以适合在数据库连接池等场景使用,避免资源过度消耗
	 */
	private final static Semaphore permits = new Semaphore(10);
	public static void main(String[] args) {
		try {
			for (int i = 0 ; i < 100 ;i++) {
				new Thread(){
					public void run(){
						try {
							permits.acquire();
							System.out.println("获取了许可,执行任务!");
						} catch (InterruptedException e) {
							e.printStackTrace();
						}finally{
							//归还了许可证
							permits.release();
						}
					}
				}.start();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

 2、Exchanger(交换器)

  

public class ExchangerTest {
	public static void main(String []args) {
	        final Exchanger <Integer>exchanger = new Exchanger<Integer>();
	        for(int i = 0 ; i < 10 ; i++) {
	            final Integer num = i;
	            new Thread() {
	                public void run() {
	                    System.out.println("我是线程:Thread_" + this.getName() + "我的数据是:" + num);
	                    try {
	                        Integer exchangeNum = exchanger.exchange(num);
	                        Thread.sleep(1000);
	                        System.out.println("我是线程:Thread_" + this.getName() + "我原先的数据为:" + num + " , 交换后的数据为:" + exchangeNum);
	                    } catch (InterruptedException e) {
	                        e.printStackTrace();
	                    }
	                }
	            }.start();
	        }
	    }
}

   代码说明:

  可以看到,如果某个线程和另一个线程传送了数据,它接受到的数据必然是另一个线程传递给他的,中间步  骤由Exchanger去控制,其实你可以说,我自己随机取选择,不过中间的算法逻辑就要复杂一些了

 

     下面还有几种工具类需要介绍,稍后会完善过来。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics