`
skzr.org
  • 浏览: 367301 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

主题:淘宝面试题:如何充分利用多核CPU,计算很大的List中所有整数的和

阅读更多
如题:论坛帖子地址

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

public class MyWorkThread extends Thread {
	private List<integer> list;
	private int start, end;
	private long value;
	private Result result;

	
	public MyWorkThread(List<integer> list, Integer start, Integer end, Result result) {
		this.list = list;
		this.start = start;
		this.end = end;
		this.result = result;
	}


	private void add(int v) {
		if (Long.MAX_VALUE - v &gt; value) {
			value += v;
		} else {
			result.addSum(value);
			value = v;
		}
	}

	public void run() {
		try {
			for(int i = start; i  list = new ArrayList<integer>();
		for (int i = 0; i  threads = new ArrayList<thread>();
		for (;;) {
			end = start + len;
			if (end &gt; list.size()) end = list.size();
			threads.add(new MyWorkThread(list, start, end, result));
			start = end;
			if (start == list.size()) break;
		}
		result.setCountThread(threads.size());
		
		for (Thread thread : threads) {
			thread.start();
		}
		
		synchronized (result) {
			while(!result.isGameOver()) result.wait();
		}
		System.out.println("和为:" + result.getSum());
	}
}

class Result {
	private BigDecimal sum;
	private int countFinish, countThread;
	
	
	public BigDecimal getSum() {
		return sum;
	}
	
	public void setCountThread(int countThread) {
		assert countThread &gt; 0;
		this.countThread = countThread;
	}
	
	
	private void checkGameOver() {
		if (isGameOver()) notifyAll();
	}
	
	public synchronized boolean isGameOver() {
		return countFinish &gt;= countThread;
	}
	
	public synchronized void addSum(long v) {
		sum = sum == null ? new BigDecimal(v) : sum.add(BigDecimal.valueOf(v));
	}
	
	public synchronized void finishA() {
		countFinish++;
		checkGameOver();
	}
}
 
分享到:
评论

相关推荐

    若邻网Python工程师面试题

    2. **丰富的库支持**:Python 拥有庞大的标准库和第三方库,几乎涵盖了所有应用领域,如网络编程、图形用户界面、科学计算等。 3. **跨平台性**:Python 可以运行在多种操作系统上,如 Windows、Linux 和 macOS 等。...

    delphi面试题.pdf

    ### Delphi 面试题知识点解析 #### 一、基础知识题解析 1. **Delphi 是什么?它主要应用于什么领域?** - **Delphi** 是一种基于 Object Pascal 的集成开发环境(IDE),主要用于 Windows 平台上的应用程序开发。...

    110道python面试题

    - **作用**: 由于GIL的存在,在多线程环境下,即使CPU有多核也无法充分利用多核的优势,因为同一进程中只有一个线程可以执行Python字节码。 - **影响**: 对于I/O密集型的应用,GIL的影响较小,但对于CPU密集型任务...

    python面试题及答案.txt

    根据给定文件的信息,我们可以总结出一系列与Python相关的面试题及其答案。这些问题涵盖了Python的基本语法、数据类型、高级特性等多个方面。接下来,我们将详细解析这些知识点。 ### 模块和包的区别 在Python中,...

    Python面试常见问题汇总集锦(含爬虫工程师面试考点)

    Python也提供了多线程和多进程支持,以便更好地利用多核处理器。 6. 全局解释器锁(GIL) Python中的全局解释器锁(GIL)是为了简化内存管理而设计的,它限制了同一时刻只有一个线程可以执行Python字节码。这意味着...

    搞定这套Python爬虫面试题(面试会so easy)

    - 利用多进程可以充分利用多核CPU资源。 7. **深拷贝与浅拷贝** - 深拷贝创建一个全新的对象,而浅拷贝仅复制对象的引用。 - 当原对象被修改时,深拷贝的对象不受影响,而浅拷贝的对象可能会受到影响。 8. **is...

    python面试题

    ### Python面试题详解 #### 1. Python的函数参数传递 在Python中,函数参数的传递遵循“传值”而非“传引用”的原则。当传递不可变数据类型(如整数、字符串等)时,实际上是将该数据类型的值复制一份传递给函数;...

    java面试讲题汇总-word可打印版

    51. Java 8的ConcurrentHashMap弃用分段锁是因为分段锁在多核CPU环境下性能瓶颈,改为使用CAS和Node链表实现。 52. ConcurrentHashMap使用synchronized而非ReentrantLock是因为减少锁粒度,提高并发性能。 53. ...

    Redis面试必会的题目

    通过在同一台机器上启动多个Redis实例,可以充分利用多核资源。 3. **Redis的性能优势**: - **速度**:由于数据存储在内存中,Redis的读写速度非常快,接近O(1)的时间复杂度。 - **丰富的数据类型**:支持多种...

    Python面试题

    这限制了多核CPU下的并行计算能力,但在IO密集型任务中,多线程仍然能提高效率。 - 使用`threading`库可以创建线程,但需要注意GIL的存在可能导致多线程不如预期中的并行。 以上是Python面试中常见的知识点,理解...

Global site tag (gtag.js) - Google Analytics