- 浏览: 6333 次
- 性别:
- 来自: 西安
最新评论
文章列表
设置线程池大小
要想正确地设置线程池的大小,必须分析计算环境、资源预算和任务的特性。在部署的系统中有多少个CPU?多大的内存?任务是计算密集型、I/O密集型还是二者皆可?它们是否需要像JDBC连接这样的稀缺资源?如果需要执行不同类别的任务,并且它们之间的行为相差很大,那么应该考虑使用多个线程池,从而使每个线程池可以根据各自的工作负载来调整。
对于计算密集型的任务,在拥有Ncpu个处理器的系统上,当线程池的大小为Ncpu+1个时,通常能实现最优的利用率。(即使当计算密集型的线程偶尔由于页缺失故障或者其他原因而暂停时,这个“额外”的线程也能确保CPU的时钟周期不会被浪费 ...
shutdownNow的局限性
shutdownNow是强行关闭ExecutorService的,它会尝试取消正在执行的任务,并返回所以已提交但尚未开始的任务,但是我们无法通过常规方法来找出哪些任务已经开始但尚未结束。这意味着我们无法在关闭过程中知道正在执行的任务的状态,除非任务本身会执行某种检查。为此,设计了一个TrackingExecutor类跟踪在关闭之后被取消的任务,getCancelledTasks返回被取消的任务清单。要使这项技术能发挥作用,任务在返回时必须维持线程的中断状态。具体代码如下:
public class TrackingExecutor extend ...
对于持有线程的服务,只要服务的存在时间大于创建线程的方法的存在时间,那么就应该提供生命周期方法。
在下面的程序中给出了一个简单的日志服务示例,其中日志操作在单独的日志线程中执行。产生日志消息的线程并不会将消息直接写入输出流,而是由LogWriter通过BlockingQueue将消息提交给日志线程,并由日志线程写入。这是一种多生产者单消费者(Multiple-Producer,Single-Consumer)的设计方式:每个调用log的操作都相当于一个生产者,而后台的日志线程则相当于消费者。如果消费者的处理速度低于生产者的生成速度,那么BlockingQueue将阻塞生产者,直 ...
不可中断的阻塞:
Java.io 包中的同步 Socket/IO。 在服务器应用程序中,最常见的阻塞I/O形式就是对套接字进行读取和写入。虽然InputStream和OutputStream中的read和write等方法都不会响应中断,但通过关闭底层的套接字,可以使得由于执行read或write等方法而被阻塞的线程抛出一个SocketException。
Java.io包中的同步I/O。 当中断一个正在InterruptibleChannel上等待的线程时,将抛出ClosedByInterruptException并关闭链路(这还会使得其他在这条链路上阻塞的线程同样抛出ClosedBy ...
不可靠的取消操作将把生产者置于阻塞的操作中
class BrokenPrimeProducer extends Thread{
private final BlockingQueue<BigInteger> queue;
private volatile boolean cancelled = false;
BrokenPrimeProducer(BlockingQueue<BigInteger> queue){
this.queue = queue;
}
public void run(){
t ...
关于页面渲染的不同操作解析:
问题:一般地,对HTML文档进行处理时,当遇到文本标签时,将其绘制到图像缓存中。当遇到图像引用时,先通过网络获取它,然后再将其绘制到图像缓存中。
1. 串行地渲染页面元素,即普通的网页页面中图片和文本同时加载
public class SingleThreadRenderer{
void renderPage(CharSequence source){
renderText(source); //渲染文本
List<ImageData> imageData = new Array ...
Runnable和Callable描述的都是抽象的计算任务。这些任务通常是有范围的,即都有一个明确的起始点,并且最终会结束。Executor执行的任务有4个生命周期阶段:创建、提交、开始和完成。由于有些任务可能要执行很长的时间 ...
现在在研究一个算法问题,需要用到快速排序,突然之间不会写了,真是尴尬,现在将经典的算法之一:快速排序算法代码整理出来,以便日后学习中快速翻阅到。
public static void Sort(int[] arrs,int left,int right){
if(left<right){
int temp = quickSort(arrs, left, right);
Sort(arrs, left, temp-1);
Sort(arrs, temp+1, right);
}
}
public static i ...
可变的Point类
@NotThreadSafe
public class MutablePoint{
public int x,y;
public MutablePoint(){x=0;y=0;}
public MutablePoint(MutablePoint p){
this.x=p.x;
this.y=p.y;
}
}
不可变的Point类
@Immutable
public class Point{
public final int x,y;
public Point(int x ...
加锁机制既可以确保可见性又可以确保原子性,而volatile变量只能确保可见性。
当前仅当满足一下所有条件时,才应该使用volatile变量:
对变量的写入操作不依赖变量的当前值,或者你能确保只有单个线程更新变量的值。
该变量不会与其他状态变量一起纳入不变性条件中。
在访问变量时不需要加锁。
线程封闭:当访问共享的可变数据时,通常需要使用同步。一种避免使用同步的方式就是不共享数据。如果仅在单线程内访问数据,就不需要同步。这种技术被称为线程封闭(Thread Confinement).
Ad-hoc 线程封闭是指,维护线程封闭性的职责完全由程序实现来承担。
不可变对 ...