Java进阶学习
chadm
这个作者很懒,什么都没留下…
展开
-
JSR 175 Java 注解
注解是一种特殊的接口 ,Annotation是一种元数据,提供了程序的一些信息,但不是程序的一部分,注解对有注解的程序执行没有任何影响There are two kinds of interface declarations - normal interface declarations and annotation type declarations (§9.6).用@来向编译器说明这是一个annotation,注解主要有3种用途通知编译器,检查错误和警告编译时和部署时处理,可以用注解来生成原创 2020-12-04 21:50:42 · 239 阅读 · 0 评论 -
JSR 335 Lambda Expressions学习系列
JSR 335: Lambda Expressions for the JavaTM Programming Language主要分为3篇来学习Java里面的functional interfaceJava里面Lambda表达式Java里面的StreamJSR 335提供的API包括新类和现有类的添加。新增加的包java.util.function 包包含通用功能接口,这些接口为lambda表达式和方法引用提供目标类型。java.util.stream 包含Streams功能的大多数接原创 2020-12-02 22:12:45 · 173 阅读 · 0 评论 -
JSR 335 之Java中的Stream
1.函数式编程函数式编程(英语:functional programming)或称函数程序设计、泛函编程,是一种编程范式,它将电脑运算视为函数运算,并且避免使用程序状态以及易变对象。λ演算(lambda calculus)为该语言最重要的基础。而且,λ演算的函数可以接受函数当作输入(引数)和输出(传出值)。比起指令式编程,函数式编程更加强调程序执行的结果而非执行的过程,倡导利用若干简单的执行单元让计算结果不断渐进,逐层推导复杂的运算,而不是设计一个复杂的执行过程。在函数式编程中,函数是第一类对象(第原创 2020-12-02 22:10:26 · 253 阅读 · 0 评论 -
Java CompletionStage和CompletableFuture
1.CompletionStageCompletionStage表示一个异步计算的可能阶段,当另一个CompletionStage完成时,会执行一个操作或计算一个值。CompletionStage接口里面的方法,主要由几个关键单词组成的apply/accept/run 、 then/both/either 和async 组合成各方法的含义1.1 CompletionStage的执行方式一个新的CompletionStage的执行方式有3种同步执行异步执行,在一个ForkJoinPool线程池里原创 2020-11-30 21:41:33 · 1949 阅读 · 0 评论 -
JSR 335之Java里面Lambda表达式
Lambda表达式也是Java 8引入的新特性(JSR 335),Lambda 表达式把函数式编程风格引入到了 Java 平台上,可以极大的提高 Java 开发人员的效率。详细说明见15.27. Lambda ExpressionsLambda 表达式的语法很灵活。它们的声明方式类似 Java 中的方法,有形式参数列表和主体。LambdaParameters -> LambdaBody从定义形式来看,主要由3个部分组成:-> 符号,代表是Lambda表达式参数的类型是可选的。在不原创 2020-11-28 22:01:12 · 196 阅读 · 0 评论 -
JSR 335 之 Java里面的functional interface
1.函数式编程在介绍functional interface前,先简单说明一下函数式编程函数式编程的定义如下:“函数式编程是一种编程范式。它把计算当成是数学函数的求值,从而避免改变状态和使用可变数据。它是一种声明式的编程范式,通过表达式和声明而不是语句来编程对函数式编程支持程度高低的一个重要特征是函数是否作为编程语言的一等公民出现,也就是编程语言是否有内置的结构来表示函数。作为面向对象的编程语言,Java 中使用接口来表示函数functional interface 是在JDK 8里面引入的,定义在原创 2020-11-28 21:54:07 · 209 阅读 · 0 评论 -
Java多线程在android中的使用_FgThread
FgThread类的作用是为系统提供一个运行在前台的共享单例线程,用来执行通用的前台service操作,不会阻塞任何东西1.FgThread简介类定义如下:public final class FgThread extends ServiceThread几个关键属性private static FgThread sInstance FgThread对象private static Handler sHandler handler对象,用来处理消息private static Handle原创 2020-11-25 23:29:07 · 847 阅读 · 0 评论 -
Java多线程在android中的使用_AsyncTask
AsyncTask是android提供的一个轻量级的异步任务,用来执行后台任务,并将结果发送到UI线程。注意:此类在api 30(Android 11)中AsyncTask被正式废弃被弃用后,Android给出了两个替代的建议:java.util.concurrent包下的相关类,如Executor,ThreadPoolExecutor,FutureTask。kotlin并发工具,那就是协程 - Coroutines了。1.AsyncTask类简介AsyncTask是一个抽象类,类的定原创 2020-11-25 23:03:32 · 348 阅读 · 0 评论 -
Java并发编程框架_并发容器
Java多线程Concurrency框架学习系列文章 _5并发容器, 分析过程中的Demo1.数据结构:1.1数组数组在内存中顺序存储, 所以只要给出一个数组下标, 就可以读取到对应的数组元素,支持随机读取根据下标查找是O(1);插入和删除是O(n)适用于读多写少的场景1.2.链表链表(linked list) 是一种在物理上非连续、 非顺序的数据结构, 由若干节点(node) 所组成。分单链表和双链表,一般实现的时候会使用head/tail指针来辅助实现相关的操作查找是O(n)插原创 2020-11-23 22:59:12 · 143 阅读 · 0 评论 -
Java并发编程框架_原子变量
Java多线程Concurrency框架学习系列文章 _4原子变量, 分析过程中的Demo组合操作,像value++不是作为单个操作来执行的,实际上包含3个步骤:读取当前value值当前value值+1把value新值写入内存看一个简单的Demo,代码文件public class AtomicDemo { public static void main(String [] args) { int value = 0; value++; }}原创 2020-11-22 12:17:58 · 215 阅读 · 1 评论 -
Java并发编程框架_forkjoin框架
Forkjoin框架是在JDK 7里面引入的,适用于将一个大的任务分成N个子任务并行来执行,然后合并每个子任务的结果并返回。来源于Doug Lea大神的forkjoin论文如下分析基于JDK 81.fork/join框架设计fork/join框架设计如下:一个工作线程池:每个线程是一个标准的heavy thread(ForkJoinWorkerThread的子类),有属于自己的工作队列,执行里面的任务经量级任务ForkJoinTask:所有fork/join的任务都是经量级的也执行类,ForkJ原创 2020-11-21 14:53:27 · 196 阅读 · 0 评论 -
ThreadLocal解决单个线程内部的变量共享的问题
首先看一下官方文档的说明This class provides thread-local variables. These variables differ from their normal counterparts in that each thread that accesses one (via its {@code get} or {@code set} method) has its own, independently initialized copy of the variable.原创 2020-11-18 23:45:08 · 245 阅读 · 0 评论 -
JSR 166 Concurrency学习系列文章
主要涉及到2个标准JSR 133 Java Memory ModuleJSR 166 Concurrency先学习并发编程出现问题的原因1.java 并发的一些基础知识然后再了解Java语言提供的解决方案1.volatile、final和synchronized2.wait-notify-sleep-interrupt-join方法的一些理解进阶学习java.util.concurrent包里面的内容,Java提供的性能和扩展性更高的解决方案,主要分如下几篇来讲解1.Java 并发编程框原创 2020-11-18 23:39:58 · 808 阅读 · 0 评论 -
Java并发编程框架_Executor框架
Executor框架的主要类有:任务接口:有2种,没有返回值的Runnable,有返回值的Callable任务结果接口:Future 代表一个任务的执行结果,由于Thread里面只支持Runnable类型,所以在实现的时候,Callable的实现类RunnableAdapter里面封装了一个Runnable对象,result对应Future任务执行:Executor代表了定义了任务执行动作任务执行服务:扩展了Executor,添加了submit方法,支持传入Runnable和Callable任务原创 2020-11-18 23:21:52 · 172 阅读 · 0 评论 -
Java 并发编程框架_简介
提到Java并发编程,就必须先了解一下Doug Lea大神,java.util.concurrent包的作者,个人主页Java里面的并发编程框架是基于其aqs论文,提供了基于Lock接口来实现并发功能和一套框架,论文地址先了解论文里面关于设计和实现部分的说明1.aqs框架的设计和实现简介1.1同步状态AbstractQueuedSynchronizer类里面只使用了一个int(32bit) state来表示同步状态,对外提供getState/setState和compareAndSetStat原创 2020-11-18 23:20:19 · 380 阅读 · 0 评论 -
Java并发编程框架_Lock
Lock框架的核心类是AbstractQueuedSynchronizer,依赖于一个FIFO的等待队列,提供了阻塞锁和相关的同步器1.使用简介同步器的主要使用方式是继承,子类通过继承同步器并实现它的抽象方法来管理同步状态,独占式tryAcquire 获取同步状态,实现该方法需要查询当前状态并判断同步状态是否符合预期,然后再进行CAS设置同步状态tryRelease 释放同步状态,等待获取同步状态的线程将有机会获取到同步状态isHeldExclusively 判断是否在独占模式下被线程占原创 2020-11-18 23:18:37 · 126 阅读 · 0 评论 -
Integer转int出现NullPointException
之前在项目中,遇到一个Integer转int出现NullPointException的问题,导致无法开机,记录一下示例代码如下:HashMap<String,Integer> typeMap = new HashMap<String,Integer>();typeMap.put("one",1);int value = typeMap.get("two");原因很清楚,当Integer为空的时候,转换成Int会调用Integer.intValue方法,所以出现空指针1.原创 2020-11-09 23:56:58 · 1767 阅读 · 0 评论 -
Java编写线程安全代码的建议
要编写线程安全的代码,核心在于对状态的访问操作进行管理,特别是对共享和可变的状态访问,主要有3种实现方式:不在线程之间共享该状态变量将状态变量修改为不可变的变量在访问状态时使用同步1.Java语言提供的支持Java语言提供了synchronized/final/volatile 3个关键来辅助实现编写线程安全的代码sychronized关键字,既保证可见性,也保证原子性volatile关键字,只能保证可见性,不能保证原子性。当且仅当满足以下条件的时候,才应该使用volatile原创 2020-11-09 23:48:08 · 166 阅读 · 0 评论 -
HTTP断点续传原理
问题来源:How to pause/resume downloading with retrofit2JakeWharton :There is no built-in pause or resume. If your server supports range requests you can break the connection at any time during a streaming download and then send a range header in a follow-up原创 2020-11-05 22:09:53 · 262 阅读 · 0 评论 -
java 并发的一些基础知识
1.并发编程出现问题的原因CPU、内存、IO设备三者速度的差异,为了合理利用CPU的高性能,平衡3者之间的速度差异,系统做了如下优化CPU增加了缓存,以均衡与内存的速度差异操作系统增加了进程、线程,以分时复用CPU,进而均衡CPU与IO设备的程度差异编译程序优化指令执行次序,使得缓存能够得到更加合理的利用并发编程的问题根源也在这里,主要有如下3个方面缓存导致的可见性问题一个线程对共享变量的修改,另外一个线程能够立即看到,称为可见性。在多核时候,每颗CPU都有自己的缓存,这时CPU原创 2020-10-31 01:46:43 · 75 阅读 · 0 评论 -
volatile、final和synchronized
首先介绍几个名词:JSL : Java Language Specification 在JSR337中定义JMM :Java Memory Model,在JSR133中定义volatile、final和synchronized都是Java语言提供的关键字volatile1.语义说明在JSL 8.3.1.4 描述了Java语言中volatile的说明Java语言提供了多线程访问共享变量的能力,为了保证每个线程获取到的值都是一致的,一个线程可以通过占有一个lock来保证对变量的独占性。Jav原创 2020-10-31 01:44:02 · 1004 阅读 · 0 评论 -
wait-notify-sleep-interrupt-join方法的一些理解
几个方法都是用来做线程管理的。几个关键点:定义的地方不同,几个方法定义在不同的类里面wait-notify定义在Obejct类里面,sleep-interrupt-join定义在Thread类里面wait方法会释放monitor,需要用nofity/notifyAll来唤醒重新获取monitor;sleep方法不会释放monitorjoin方法是等待当前进程结束,利用wait方法来实现的,主线程A等待子线程B完成(主线程A通过调用子线程B的join()方法来实现)interr原创 2020-10-31 01:42:39 · 166 阅读 · 0 评论 -
Java反射
1.反射方法MethodgetDeclaredMethod是获取该类声明的方法,不包括继承的。 Method getDeclaredMethod(String name, Class… parameterTypes)返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。还有一个getMethod是只能获取public的方法 ge...原创 2018-08-06 22:28:13 · 213 阅读 · 0 评论