- 浏览: 331210 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (212)
- spring (21)
- design pattern(java) (12)
- linux-shell (28)
- java-thread (20)
- java-collection (6)
- java-reflect (9)
- mysql (11)
- java-io (7)
- java-util&lang&io (3)
- algorithm (3)
- interview (2)
- tools-eclipse (2)
- tools-maven (1)
- web-script (1)
- java组建 (13)
- 博客收藏 (1)
- 架构设计与实践 (10)
- active-mq (6)
- java-jvm&性能&原理 (27)
- tomcat (2)
- flume (1)
- serialization (2)
- git (1)
- cache&redis (8)
- guava (1)
- zookeeper (3)
- socket&tcp&udp&http (6)
- test (1)
最新评论
-
bbls:
有用有用有用
java-jvm-jstack-(监视器和锁的概念) -
王新春:
小侠有点帅哦 写道此流怎么关闭新春这个实现 可以不关闭的,哈哈 ...
源码剖析之java.io.ByteArrayOutputStream -
小侠有点帅哦:
此流怎么关闭新春
源码剖析之java.io.ByteArrayOutputStream -
cumt168:
写的很好为什么初始化参数,年轻代-Xmn10M def new ...
jvm之内存申请过程分析 -
ronin47:
应该是跟共享域名思路差不多,根据cookie的key作判断
跨域:一种通过服务端解决跨域的实现
有一种场景:多个线程到达(比如合并多个线程返回的结果)后才能执行某个任务,并且只能执行一次。
有几种方式:
1、Thread的join,不再讲解,因为使用不方便,也是不建议使用的方式。
2、AtomicInteger ,其increaseAndGet 是非常方便实现这个需求的。
3、CountDownLatch ,这个组件也可以,并且在特定场景下,这个是最好的实现,比如有时间等待限制的。
下面看这个2 和 3的case。
有几种方式:
1、Thread的join,不再讲解,因为使用不方便,也是不建议使用的方式。
2、AtomicInteger ,其increaseAndGet 是非常方便实现这个需求的。
3、CountDownLatch ,这个组件也可以,并且在特定场景下,这个是最好的实现,比如有时间等待限制的。
下面看这个2 和 3的case。
import java.util.Vector; import java.util.concurrent.atomic.AtomicInteger; /** * * @author xinchun.wang * @email: 532002108@qq.com * @createTime 2015-4-2 下午11:25:26 */ public class AtomicExecute { private static final int all = 3; public static void main(String[] args) throws Exception { Vector<Integer> vector = new Vector<Integer>(); AtomicInteger mask = new AtomicInteger(0); TestThread t1 = new TestThread(mask, vector, 1, 10); TestThread t2 = new TestThread(mask, vector, 11, 20); TestThread t3 = new TestThread(mask, vector, 21, 30); t1.start(); t2.start(); t3.start(); Vector<Integer> vectorMain = new Vector<Integer>(); for (int i = 1; i <= 30; i++) { vectorMain.add(i * i * i); } System.out.println("vectorMain: " + addVector(vectorMain)); } private static long addVector(Vector<Integer> vector) { long result = 0; for (Integer item : vector) { result = result + item; } return result; } public static class TestThread extends Thread { private final AtomicInteger mask; private final Vector<Integer> vector; private int begin; private int end; public TestThread(AtomicInteger mask, Vector<Integer> vector, int begin, int end) { this.mask = mask; this.vector = vector; this.begin = begin; this.end = end; } @Override public void run() { for (int i = begin; i <= end; i++) { vector.add(i * i * i); } // do some things if (mask.incrementAndGet() == all) { System.out.println("vector: " + addVector(vector)); } } } }
/** * * @author xinchun.wang * @email: 532002108@qq.com * @createTime 2015-4-2 下午11:25:26 */ public class CountDown { private static final int all = 3; public static void main(String[] args) throws Exception { Vector<Integer> vector = new Vector<Integer>(); CountDownLatch mask = new CountDownLatch(all); TestThread t1 = new TestThread(mask, 1, 10, vector); TestThread t2 = new TestThread(mask, 11, 20, vector); TestThread t3 = new TestThread(mask, 21, 30, vector); TestThread2 t4 = new TestThread2(mask, vector); t4.start(); t1.start(); t2.start(); t3.start(); Vector<Integer> vectorMain = new Vector<Integer>(); for (int i = 1; i <= 30; i++) { vectorMain.add(i * i * i); } System.out.println("vectorMain: " + addVector(vectorMain)); } private static long addVector(Vector<Integer> vector) { long result = 0; for (Integer item : vector) { result = result + item; } return result; } /** * 输出结果的线程 */ public static class TestThread2 extends Thread { private final CountDownLatch mask; private final Vector<Integer> vector; public TestThread2(CountDownLatch mask, Vector<Integer> vector) { this.mask = mask; this.vector = vector; } @Override public void run() { try { mask.await(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("vector: " + addVector(vector)); } } /** * 实际添加数据的线程 */ public static class TestThread extends Thread { private final CountDownLatch mask; private int begin; private int end; private Vector<Integer> vector; public TestThread(CountDownLatch mask, int begin, int end, Vector<Integer> vector) { this.mask = mask; this.begin = begin; this.end = end; this.vector = vector; } @Override public void run() { for (int i = begin; i <= end; i++) { vector.add(i * i * i); } mask.countDown(); } } }
- file.zip (1.7 KB)
- 下载次数: 0
发表评论
-
Thread.isInterrupted 的理解
2017-05-24 21:01 1797interrupt方法用于中断线程。调用该方法的线程的状态 ... -
Condition&(wait,notify)
2017-05-22 10:58 521Condition.await和Object.wait ... -
AQS-预备-背景
2017-05-20 18:16 562AbstractQueuedSynchronizer: ... -
LockSupport
2017-05-19 22:15 535LockSupport类是Java6(JSR166-JUC ... -
Synchronized&AbstractQueuedSynchronizer[摘抄]
2017-05-19 21:29 472目前在Java中存在两种锁机制:synchronized和 ... -
CountDownLatch/CyclicBarrier
2017-05-19 20:59 939CountDownLatch: 功能:是一个同步工具类 ... -
Thread-wait/notify
2017-05-19 11:59 611java 线程通过对象的Wait和Notify进行同步,但 ... -
AQS-预备-FIFOMutex
2017-05-18 20:25 482通过AtomicBoolean 和队列 ... -
AQS-预备知识 CLH lock queue[摘抄]
2017-05-18 20:07 368经典! -
ThreadLocal 在web环境下使用的边界问题
2014-06-12 13:30 3486ThreadLocal 相关分析,请查看http://wang ... -
原码剖析之ThreadPoolExecutor进阶
2013-06-17 17:15 1710继续ThreadPoolExecutor 线程池的分析~~~~ ... -
原码剖析之ThreadPoolExecutor入门
2013-06-15 10:44 1401jdk 1.5 开始提供支持线 ... -
源码剖析之ThreadLocal
2013-06-08 12:57 3197背景:1、如果一个对象 ... -
源码剖析之CyclicBarrier
2013-06-07 00:07 2828CyclicBarrier:jdk current 包提供了一 ... -
Thread的join方法
2013-02-25 23:44 1553Thread类中的join方法的语义: void java. ... -
lock 锁class类对象和实例对象
2013-02-25 23:18 2126java thread 线程中 的synchronized关键 ... -
lock实现运行时死锁检测
2013-02-24 23:02 1511java的多线程机制非常强 ... -
异常与锁的释放(synchronized )
2013-02-16 23:28 5391synchronized 获取的锁,在方法抛出异常的时候会自动 ... -
异常与锁的释放(lock)
2013-02-16 22:57 2544获取lock锁后发生异常后,线程退出,lock锁不释放 p ...
相关推荐
//就把该回调函数添加到线程池的任务中,让线程池里面的线程去执行,然后将自定义定时器的超时时间置为最初值0; // // iv)用户通过del_a_timer来删除某个定时器,通 过destroy_mul_timer来删除整个多定时器。
当多个线程访问某个类时,这个类始终能表现出正确的行为,那么就称这个类是线程安全的 无状态对象一定是线程安全的,大多数Servlet都是无状态的 原子性 一组不可分割的操作 竞态条件 基于一...
程序此时启动一个线程来处理这个任务,用户界面上显示一个进度条指示用户任务执行的状态。这个功能就可以使用事件来进行处理。可以将处理任务的类作为消息的发送者,任务开始时,发出“TaskStart”事件,任务进行中...
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概...
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概...
找到一个指标来反映电梯的效率运行模拟以测试效率尝试不同的任务到达分布让每个任务在一定时间后到期(人们变得不耐烦并决定走路)第二次迭代第二,我要让电梯在每一步都承担多项任务。 假设: 每部电梯最多可承担 ...
增量收集器把堆栈分为多个域,每次仅从一个域收集垃圾。这会造成较小的应用程序中断。 2.5.分代收集器 这种收集器把堆栈分为两个或多个域,用以存放不同寿命的对象。jvm生成的新对象一般放在其中的某个域中。过一段...
3. Nslookup-------IP地址侦测器 ,是一个 监测网络中 DNS 服务器是否能正确实现域名解析的命令行工具。它在 Windows NT/2000/XP 中均可使用,但在 Windows 98 中却没有集成这一个工具。 4. explorer-------打开...
0149 试图连接或替换某个驱动器目录,该驱动器上的某个目录是上一次替换的目标目录。 0150 CONFIG.SYS 文件未指定系统跟踪信息,或禁止跟踪。 0151 DosMuxSemWait 的指定信号事件的数目不正确。 0152 ...
管理器、统一资源定位符队列、域名解析线程等在内的多个底层设施,提供诸 如初始化、执行多路输入输出循环、启动抓取任务等外部接口。 2.3.5. 主线程(main) 主函数,处理命令行参数,初始化应用程序对象,进入多路I/...