自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

pfnie的博客

学如逆水行舟,不行则退。以研究源码为乐趣,以写代码为疯狂。

  • 博客(24)
  • 收藏
  • 关注

原创 Java Executor并发框架(十四)Executor框架线程池使用原始方式实现生产者消费者模式

一、介绍       在 Java 中可以用 wait、notify 和 notifyAll 来实现线程间的通信。。举个例子,如果你的Java程序中有两个线程——即生产者和消费者,那么生产者可以通知消费者,让消费者开始消耗数据,因为队列缓 冲区中有内容待消费(不为空)。相应的,消费者可以通知生产者可以开始生成更多的数据,因为当它消耗掉某些数据后缓冲区不再为满。      wai

2016-10-18 22:20:43 2907

原创 Java NIO通俗编程之选择器Selector(四)

一、介绍选择器提供选择执行已经就绪的任务的能力.从底层来看,Selector提供了询问通道是否已经准备好执行每个I/O操作的能力。Selector 允许单线程处理多个Channel。仅用单个线程来处理多个Channels的好处是,只需要更少的线程来处理通道。事实上,可以只用一个线程处理所有的通道,这样会大量的减少线程之间上下文切换的开销。如果正在处理事件时,有新的连接要接入,那么新

2016-10-16 20:21:48 1641 1

原创 Java NIO通俗编程之缓冲区Buffer(三)

一、介绍本节将讨论使用缓冲区的一些更复杂的方面,比如缓冲区分配、包装和分片。我们还会讨论 NIO 带给 Java 平台的一些新功能。您将学到如何创建不同类型的缓冲区以达到不同的目的,如可保护数据不被修改的 只读 缓冲区,和直接映射到底层操作系统缓冲区的 直接 缓冲区。我们将在本节的最后介绍如何在 NIO 中创建内存映射文件。在创建一个缓冲区对象时,会调用静态方法allocate()来指定缓冲区

2016-10-16 12:46:08 719 2

原创 Java NIO通俗编程之缓冲区内部细节状态变量position,limit,capacity(二)

一、介绍我们介绍了NIO中的两个核心对象:缓冲区和通道,在谈到缓冲区时,我们说缓冲区对象本质上是一个数组,但它其实是一个特殊的数组,缓冲区对象内置了一些机制,能够跟踪和记录缓冲区的状态变化情况,如果我们使用get()方法从缓冲区获取数据或者使用put()方法把数据写入缓冲区,都会引起缓冲区状态的变化。本节将介绍 NIO 中两个重要的缓冲区组件:状态变量和访问方法 (accessor)。状态

2016-10-16 12:01:04 4747 2

转载 The substring() Method in JDK 6 and JDK 7

一、AbstractionThesubstring(int beginIndex, int endIndex) method in JDK 6 and JDK 7 are different. Knowing the difference can help you better use them. For simplicity reasons, in the followingsubs

2016-10-16 10:24:48 454

原创 JAVA 内存泄露详解

一、介绍Java的一个重要特性就是通过垃圾收集器(GC)自动管理内存的回收,而不需要程序员自己来释放内存。理论上Java中所有不会再被利用的对象所占用的内存,都可以被GC回收,但是Java也存在内存泄露,但它的表现与C++不同。那么什么是内存泄露呢?下面我给出的定义如下:程序代码无法

2016-10-16 10:14:40 788

原创 Java NIO通俗编程之总体介绍(一)

一、介绍在Java1.4之前的I/O系统中,提供的都是面向流的I/O系统,系统一次一个字节地处理数据,一个输入流产生一个字节的数据,一个输出流消费一个字节的数据,面向流的I/O速度非常慢,而在Java 1.4中推出了NIO,这是一个面向块的I/O系统,系统以块的方式处理处理,每一个操作在一步中产生或者消费一个数据库,按块处理要比按字节处理数据快的多。在NIO中有几个核心对象需要掌握:缓

2016-10-15 18:09:31 530 1

原创 Java Executor并发框架(十三)Executor框架线程池关于异常的处理

一、介绍关于为什么要写这篇文章,是因为我对Executor线程池的两种提交任务的方式的不同产生的好奇,我们知道,可以通过execute和submit两种方式往线程池提交我们的任务,但是这两种任务提交的方式到底有什么区别呢?通过execute方式提交的任务,我们不能获取任务执行后的返回值,而通过submit提交任务的方式,我们是可以获取任务执行结束后产生的结果。那么另一个区别就是关于异常

2016-10-14 21:47:57 3581

原创 Java Executor并发框架(十二)Executor框架线程池BlockingQueue的三种实现区别

一、介绍首先我们来看一下Executors工具类中创建线程池的几个方法。ExecutorService newFixedThreadPool(int nThreads):固定大小线程池。可以看到,corePoolSize和maximumPoolSize的大小是一样的(实际上,后面会介绍,如果使用无界queue的话maximumPoolSize参数是没有意

2016-10-10 21:37:36 878

原创 本机直接内存溢出

DirectMemory容量可通过-XX:MaxDirectMemorySize指定,如果不指定,则默认与Java堆的最大值(-Xmx指定)一样。代码清单2-9越过了DirectByteBuffer类,直接通过反射获取Unsafe实例并进行内存分配(Unsafe类的getUnsafe()方法限制了只有引导类加载器才会返回实例,也就是设计者希望只有rt.jar中的类才能使用Unsafe的功能

2016-10-09 19:02:33 1427 2

原创 方法区和运行时常量池溢出

由于运行时常量池是方法区的一部分,因此这两个区域的溢出测试就放在一起进行。如果要向运行时常量池中添加内容,最简单的做法就是使用String.intern()这个Native方法。该方法的作用是:如果字符串常量池中已经包含一个等于此String对象的字符串,则返回代表池中这个字符串的String对象;否则,将此String对象包含的字符串添加到常量池中,并且返回此String对象的引用。

2016-10-09 18:40:57 730

原创 Java Executor并发框架(十一)Executor框架线程池生命周期

一、介绍我们知道线程是有多种执行状态的,同样管理线程的线程池也有多种状态。JVM会在所有线程(非后台daemon线程)全部终止后才退出,为了节省资源和有效释放资源关闭一个线程池就显得很重要。有时候无法正确的关闭线程池,将会阻止JVM的结束。线程池Executor是异步的执行任务,因此任何时刻不能够直接获取提交的任务的状态。这些任务有可能已经完成,也有可能正在执行或者还在

2016-10-09 17:53:41 519

原创 Java Executor并发框架(十)Executor框架线程池源码解析

一、介绍Executors 是 Executor、ExecutorService、ThreadFactory、Callable 类的工厂和工具方法。二、源码解析创建一个固定大小的线程池:通过重用共享无界队列里的线程来减少线程创建的开销。当所有的线程都在执行任务,新增的任务将会在队列中等待,直到一个线程空闲。由于在执行前失败导致的线程中断,如果需要继续执行接下去的

2016-10-09 17:32:32 607

原创 Java Executor并发框架(九)Executor框架线程池ExecutorService.shutdown什么时候执行

一、介绍主线程和线程池之间没有直接关系,线程池使用自己的线程。生命周期也相互独立。shutdown()可以理解为:主线程要求线程池关闭,但不会为此等待线程池执行完毕。        shutdown() 作为函数,当然是立即执行,也即是不再接受新任务了;但是它既不会强行终止正在执行的任务,也不会取消已经提交的任务。也就是说之前提交的5个任务,

2016-10-09 17:04:56 2541

原创 Java Executor并发框架(八)Executor框架线程池ThreadPoolExecutor、ScheduledThreadPoolExecutor

一、介绍Java中的线程池类有两个,分别是:ThreadPoolExecutor和ScheduledThreadPoolExecutor,这两个类都继承自ExecutorService。利用这两个类,可以创建各种不同的Java线程池,为了方便我们创建线程池,Java API提供了Executors工厂类来帮助我们创建各种各样的线程池。下面我们分别介绍一下这三个类。Java线程池

2016-10-09 16:57:25 575

原创 虚拟机栈和本地方法栈溢出

由于在HotSpot虚拟机中并不区分虚拟机栈和本地方法栈,因此对于HotSpot来说,-Xoss参数(设置本地方法栈大小)虽然存在,但实际上是无效的,栈容量只由-Xss参数设定。关于虚拟机栈和本地方法栈,在Java虚拟机规范中描述了两种异常:如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常。如果虚拟机在扩展栈时无法申请到足够的内存空

2016-10-09 15:16:29 2244

原创 实战OutOfMemoryError异常以及使用Eclipse Memory Analyzer查看Dump日志

之所以写这篇博客是因为在一次的面试过程中,被问到这个,而我却没有回答出来。当时面试官的问题是:你平时是如何查看Dump日志的?而我当时一听这个问题,蒙了,因为我根本就没有弄过这个什么Dump日志,于是写下这篇博客记录一下。        在Java虚拟机规范的描述中,除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OutOfMemoryError异常的可能,本节将通过若

2016-10-09 14:12:43 5599

原创 Java Executor并发框架(七)Executor框架线程池任务执行全过程(下)

一、介绍基于Executor接口中将任务提交和任务执行解耦的设计,ExecutorService和其各种功能强大的实现类提供了非常简便方式来提交任务并获取任务执行结果,封装了任务执行的全部过程。本文尝试通过对该部分源码的解析以ThreadPoolExecutor为例来追踪任务提交、执行、获取执行结果的整个过程。为了避免陷入枯燥的源码解释,将该过程和过程中涉及的角色与我们工作中的场景和场景中

2016-10-09 09:58:09 668

原创 Java Executor并发框架(六)Executor框架线程池任务执行全过程(上)

一、介绍基于Executor接口中将任务提交和任务执行解耦的设计,ExecutorService和其各种功能强大的实现类提供了非常简便方式来提交任务并获取任务执行结果,封装了任务执行的全部过程。本文尝试通过对该部分源码的解析以ThreadPoolExecutor为例来追踪任务提交、执行、获取执行结果的整个过程。为了避免陷入枯燥的源码解释,将该过程和过程中涉及的角色与我们工作中的场景和场景中

2016-10-08 20:14:53 1330

原创 Java Executor并发框架(五)ExecutorService

一、介绍Executor的实现通常都会创建线程来执行任务,但是使用异步方式来执行任务时,由于之前提交任务的状态不是立即可见的,所以如果要关闭应用程序时,就需要将受影响的任务状态反馈给应用程序。为了解决执行服务的生命周期问题,ExecutorService扩展了Executor接口,添加了一些用于生命周期管理的方法。如下:public interface ExecutorService

2016-10-08 17:09:12 628

原创 Java Executor并发框架(四)创建线程池的核心参数的解释

一、ThreadPoolExecutor的相关属性private final BlockingQueue workQueue; // 任务阻塞队列private final ReentrantLock mainLock = new ReentrantLock(); // 互斥锁private final HashSet workers = new Hash

2016-10-08 16:44:25 8695 1

原创 Java Executor并发框架(三)ThreadFactory介绍

一、介绍使用 ThreadFactory 创建新线程。如果没有另外说明,则在同一个 ThreadGroup 中一律使用 Executors.defaultThreadFactory() 创建线程,并且这些线程具有相同的 NORM_PRIORITY 优先级和非守护进程状态。通过提供不同的 ThreadFactory,可以改变线程的名称、线程组、优先级、守护进程状态等等。如果从 new

2016-10-08 15:20:36 1810

原创 Java Executor并发框架(二)RejectedExecutionHandler介绍

一、介绍当Executor已经关闭(即执行了executorService.shutdown()方法后),并且Executor将有限边界用于最大线程数量和工作队列容量,且已经饱和时,在方法execute()中提交的新任务将被拒绝。在以上述情况下,execute 方法将调用其 RejectedExecutionHandler 的 RejectedExecutionHandler.

2016-10-08 14:18:03 17130

原创 Java Executor并发框架(一)整体介绍

一、概述Java是天生就支持并发的语言,支持并发意味着多线程,线程的频繁创建在高并发及大数据量是非常消耗资源的,因为java提供了线程池。在jdk1.5以前的版本中,线程池的使用是及其简陋的,但是在JDK1.5后,有了很大的改善。JDK1.5之后加入了java.util.concurrent包,java.util.concurrent包的加入给予开发人员开发并发程序以及解决并发问题很大的帮

2016-10-08 11:57:04 1063

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除