- 浏览: 515949 次
- 性别:
- 来自: 武汉
文章分类
- 全部博客 (268)
- C/C++ (5)
- LUA (0)
- JVM (6)
- UML (1)
- J2SE (43)
- J2EE (15)
- EXTJS (1)
- HTML5 (47)
- ANDROID (2)
- JAVASCRIPT (51)
- WEB SERVICES (0)
- 数据库 (2)
- 数据结构 (0)
- 应用服务器 (11)
- 设计模式应用 (0)
- JAVA性能与缓存 (1)
- ByteCode (5)
- RCP (0)
- Plugin (0)
- Eclipse (3)
- 程序人生 (14)
- Mobile (2)
- Linux/Ubuntu (31)
- sublime (2)
- python (15)
- Git (5)
- NodeJs (3)
- Crosswalk (1)
- Browserify (1)
- Backbone (1)
最新评论
/** * 淘宝面试题:如何充分利用多核CPU,计算很大的List中所有整数的和 * @author weistar * */ public class CountListIntegerSum { private long sum;// 存放整数的和 private CyclicBarrier barrier;// 障栅集合点(同步器) private List<Integer> list;// 整数集合List private int threadCounts;// 使用的线程数 public CountListIntegerSum(List<Integer> list, int threadCounts) { this.list = list; this.threadCounts = threadCounts; } /** * 获取List中所有整数的和 * * @return */ public long getIntegerSum() { ExecutorService exec = Executors.newFixedThreadPool(threadCounts); int len = list.size() / threadCounts;// 平均分割List // List中的数量没有线程数多(很少存在) if (len == 0) { threadCounts = list.size();// 采用一个线程处理List中的一个元素 len = list.size() / threadCounts;// 重新平均分割List // len = 1; } // ***创建一个障栅,等待所有线程和主线程执行完毕 barrier = new CyclicBarrier(threadCounts + 1); for (int i = 0; i < threadCounts; i++) { // 注意这里if else可用一条语句代替 //exec.execute(new SubIntegerSumTask(list.subList(i * len, len * (i + 1) > list.size() ? list.size() : len * (i + 1)))); // 创建线程任务 if (i == threadCounts - 1) {// 最后一个线程承担剩下的所有元素的计算 exec.execute(new SubIntegerSumTask(list.subList(i * len, list .size()))); } else { exec.execute(new SubIntegerSumTask(list.subList(i * len, len * (i + 1) > list.size() ? list.size() : len * (i + 1)))); } } try { barrier.await();// 关键,使该线程在障栅处等待,直到所有的线程都到达障栅处 } catch (InterruptedException e) { System.out.println(Thread.currentThread().getName() + ":Interrupted"); } catch (BrokenBarrierException e) { System.out.println(Thread.currentThread().getName() + ":BrokenBarrier"); } exec.shutdown(); return sum; } /** * 分割计算List整数和的线程任务 * * @author lishuai * */ class SubIntegerSumTask implements Runnable { private List<Integer> subList; public SubIntegerSumTask(List<Integer> subList) { this.subList = subList; } public void run() { long subSum = 0L; for (Integer i : subList) { subSum += i; } // 在CountListIntegerSum对象上同步 // 线程共享变量sum在外部类中,所以应使用外部类对象作为锁 synchronized (CountListIntegerSum.this) { sum += subSum; } try { barrier.await();// 关键,使该线程在障栅处等待,直到所有的线程都到达障栅处 } catch (InterruptedException e) { System.out.println(Thread.currentThread().getName() + ":Interrupted"); } catch (BrokenBarrierException e) { System.out.println(Thread.currentThread().getName() + ":BrokenBarrier"); } System.out.println("分配给线程:" + Thread.currentThread().getName() + "那一部分List的整数和为:\tSubSum:" + subSum); } } public static void main(String[] args) { List<Integer> list = new ArrayList<Integer>(); int threadCounts = 10;// 采用的线程数 // 生成的List数据 for (int i = 1; i <= 1000000; i++) { list.add(i); } CountListIntegerSum countListIntegerSum = new CountListIntegerSum(list, threadCounts); long sum = countListIntegerSum.getIntegerSum(); System.out.println("List中所有整数的和为:" + sum); } }
发表评论
文章已被作者锁定,不允许评论。
-
关于Thread.IsAlive属性
2015-07-04 12:12 883今天在讨论多线程的时候,谈到了这个属性。IsAlive,顾名 ... -
Java:对象的强、软、弱和虚引用
2015-02-28 11:00 731文章源自:http://zhangjunhd.blog.51 ... -
一个通用并发对象池的实现
2015-01-20 09:32 733Source: http://ifeve.com/gener ... -
如何创建不可变的Java类或对象
2015-01-07 16:29 2183在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过 ... -
并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法
2014-12-29 11:49 804文章源自:http://www.cnblogs.com/li ... -
中断线程深入
2014-12-25 15:18 795本文转自http://jiangzhengjun.itey ... -
深入java.lang.ThreadLocal类
2014-12-24 16:50 709文章源自:http://lavasoft.blog.51c ... -
Java 8新特性探究(3):解开lambda最强作用的神秘面纱
2014-07-10 17:50 711文章源自:http://developer.51cto.co ... -
Java 8特性探究(2):深入解析默认方法
2014-07-08 11:12 782文章源自:http://develop ... -
Java 8特性探究(1):通往lambda之路_语法篇
2014-07-08 09:59 692文章源自:http://developer.51cto.c ... -
java文件复制方法参考
2013-12-02 14:17 730最快的文件复制方法 private static ... -
用Java数字签名提供XML安全
2013-11-29 16:11 13134文章源自:http://www. ... -
深入理解HashMap的工作原理
2013-11-18 15:49 824HashMap的工作原理是近 ... -
JDBC4.0 驱动加载过程
2013-01-16 10:09 3634注意,jdbc4.0不再需要显示调用class.fo ... -
Java自定义的类加载器
2013-01-15 08:38 1014一、类加载器类别 * 1.java虚拟机自带的加载器 ... -
使用Log4j生成不同日志级别的日志文件
2012-12-26 17:09 5332在src根目录下存放log4j.xml文件,具体配置如下(测试 ... -
深入理解HashMap
2012-12-13 10:08 865文章摘自:http://www.iteye.c ... -
java字节码加解密
2012-06-30 09:53 1097一.创建KEY class Key { ... -
java动态代理简单实现
2012-06-30 09:45 1026一.接口 public interface Foo { ... -
线程池简单实现
2012-06-25 11:42 1097其实线程池的实现就是生产者消费者问题 的实现,理解了生产者消 ...
相关推荐
- **同步器**:用于实现线程间的同步操作,常见的同步器包括`Semaphore`、`CountDownLatch`、`CyclicBarrier`、`Exchanger`和`Phaser`等。 - **执行器**:用于管理和控制线程的执行,如`ExecutorService`等。 - **...
线程同步器CycliBarrier是Java并发编程中一个重要的工具,它允许一组线程等待彼此到达一个共同的屏障点,然后一起继续执行。相比于CountDownLatch,CyclicBarrier具有可重用性,也就是说,一旦所有线程都到达屏障点...
* `public CyclicBarrier(int parties, Runnable barrierAction)`:这是CyclicBarrier的核心构造器,在这里可以指定本局游戏的参与者数量(要拦截的线程数)以及本局结束时要执行的任务。 * `public CyclicBarrier...
AQS 定义了一个抽象的同步器框架,CountDownLatch 内部实现了 AQS 的 `tryAcquireShared()` 和 `tryReleaseShared()` 方法,通过这些方法来控制线程的等待和释放。 #### CyclicBarrier **定义与特点:** ...
Java多线程同步器在并发编程中扮演着至关重要的角色,它们帮助开发者管理线程间的协作,确保资源的正确访问和程序的顺序执行。本文将深入解析四种主要的同步器:CountDownLatch、Semaphore、Barrier和Exchanger,并...
并发同步器在多线程编程中起到协调各个线程访问共享资源,确保数据一致性与程序正确性的关键作用。本篇笔记将深入探讨Java中的并发同步机制,包括核心概念、工具类以及在实际开发中的应用。 首先,我们要理解什么是...
- **CyclicBarrier** 是同步辅助类,允许多个线程等待彼此到达一个屏障点后一起继续执行(thread-t053-jdk1.5-cyclicbarrier)。 - **SingleTaskThreadpool** 涉及到单任务线程池,可能是一种特定场景下的定制化...
4. **同步器(Synchronizers)**:JUC库中的同步器主要是通过AQS(AbstractQueuedSynchronizer)来实现的。AQS是一个抽象类,为锁和同步器提供了一种通用的底层实现。它维护了一个等待队列,提供了基于FIFO的等待...
### Java.util.concurrent同步器框架详解 #### 概述 Java平台在J2SE 1.5版本中引入了`java.util.concurrent`包,这是一系列中等层次的并发支持类集合,通过Java社区过程(Java Community Process, JCP)的Java规范...
- **构造器**:创建CyclicBarrier时需要指定线程数量n和可选的屏障动作。屏障动作会在所有线程都到达屏障点后执行。 - **await方法**:每个线程在到达屏障点时调用await方法,这会阻塞当前线程直到所有线程都调用...
它是实现Java并发包中锁和其他同步器的基础框架,例如ReentrantLock(可重入锁)、Semaphore(信号量)、CountDownLatch(倒计时门闩)、CyclicBarrier(循环栅栏)以及ReentrantReadWriteLock(可重入读写锁)等。...
- `CyclicBarrier` 和 `CountDownLatch` 是两种常用的屏障类,用于实现线程间的同步等待。 - 这些工具可以用于确保一组线程在达到某个特定点之前等待,直到所有线程都到达该点才继续执行。 #### 十八、Java线程的...
- 在3.1版本中,backport-util-concurrent引入了Phaser,这是一个可重用的同步帮助器类,支持多个参与者之间的有界同步,类似于CyclicBarrier和CountDownLatch,但更灵活。Phaser可以自动调整参与者的数量,并且在...
本节主要讲解了Java并发包中线程同步器原理剖析,具体来说是 CountDownLatch 和 CyclicBarrier 的使用和原理剖析。 一、CountDownLatch CountDownLatch 是一个同步工具,它可以让一个线程等待其他线程完成某些操作...
- **AQS同步队列**:AbstractQueuedSynchronizer,提供了一个框架来实现锁和同步器。 - **CAS无锁的概念**:Compare and Swap,乐观锁的一种实现。 - **常见的原子操作类**:AtomicInteger、AtomicLong等。 - **...
- **CyclicBarrier和CountDownLatch**:协调多个线程之间的同步,CyclicBarrier允许一组线程等待彼此到达某个点,而CountDownLatch则允许一次释放所有等待的线程。 6. **并发容器** - `java.util.concurrent`包...
- **利用Phaser类进行线程间的协作**:Phaser类可以用来代替CyclicBarrier和CountDownLatch,实现更加复杂的线程同步逻辑。 - **选择合适的并发数据结构**:根据应用场景选择适当的并发数据结构,如`...
- 同步机制:synchronized关键字,volatile变量 - 线程池:ExecutorService,ThreadPoolExecutor,ScheduledThreadPoolExecutor - 死锁、活锁、饥饿状态的理解与避免 4. **JVM**: - 堆内存与栈内存的结构 - ...