Thinking in Java
PandaHust
这个作者很懒,什么都没留下…
展开
-
内部类(七)---为什么需要内部类
需要内部类原因:内部类继承自某个类或实现某个接口,内部类的代码操作创建它的外围类的对象。可以认为内部类提供了某种进入其外围类的窗口。每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。 1)内部类可以有多个实例,每个实例都有自己的状态信息,并且与其外围类对象的信息相互独立。 2)在单个外围类中,可以让多个内部类以不同的方...原创 2018-06-10 22:16:00 · 320 阅读 · 0 评论 -
并发----任务间使用管道进行输入/输出
通过输入/输出在线程间进行通信通常很有用。在Java输入/输出类库中的对应物就是PipedWriter类。(允许任务向管道写)和PipedReader类(允许不同任务从同一个管道中读取)。import java.io.IOException;import java.io.PipedReader;import java.io.PipedWriter;import java.util.R...原创 2018-06-06 15:10:41 · 307 阅读 · 0 评论 -
并发----生产者消费者
生产者与消费者import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;/** * Created by Panda on 2018/6/6. */class Meal{ private f...原创 2018-06-06 13:24:55 · 196 阅读 · 0 评论 -
并发---线程之间的协作
当使用线程来同时运行多个任务时,可以通过使用锁(互斥)来同步两个任务的行为,从而使得一个任务不会干涉另一个任务的资源。也就是说,如果两个任务在交替着不如某项共享资源(通常是内存),可以使用互斥来使得任何时刻只有一个任务可以访问这项资源。wait()与notify()wait()提供了一种在任务之间对活动同步的方式。在wait()期间对象锁是释放的。可以通过notify()、n...原创 2018-06-05 20:14:53 · 252 阅读 · 0 评论 -
并发----终结任务
cancel() and isCancel()import java.util.ArrayList;import java.util.List;import java.util.Random;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java...原创 2018-06-05 19:09:28 · 186 阅读 · 0 评论 -
Generator (生成器)汇总
/** * Created by Panda on 2018/5/29. *///生成器:一种专门负责创建对象的类。工厂方法模式的一种应用public interface Generator <T>{ T next();}/** * Created by Panda on 2018/5/29. */public class GeneratorTest {...原创 2018-05-29 22:23:42 · 893 阅读 · 0 评论 -
并发-- 乐观加锁 Atomic and ReadWriteLock
乐观加锁compareAndSet()方法ReadWriteLock对向数据结构相对不频繁地写入,但是有多个任务要经常读取这个数据结构的这类情况进行了优化。ReadWriteLock使得可以同时有多个读取者,只要他们都不视图写入即可。如果写锁已经被其他任务持有,那么任何读取者都不能访问,直至这个写锁被释放为止。 - package com21并发1;import java...原创 2018-05-29 22:18:51 · 202 阅读 · 0 评论 -
并发--性能调优(三) 比较各种Map实现
synchronizedHashMap VS ConcurrentHashMappackage com21并发1;import 生成器.CountingGenerator;import 生成器.MapData;import java.util.Collections;import java.util.HashMap;import java.util.Map;impor...原创 2018-05-29 21:22:02 · 339 阅读 · 0 评论 -
并发--性能调优(二) 免锁容器 CopyOnWriteArrayList VS synchronized ArrayList
免锁容器免锁容器通用策略:对容器的修改可以与读取操作同时发生,只要读取者只能看到完成修改的结果即可。修改时在容器数据结构的某个部分的一个单独的副本(有时是整个数据结构的副本)上执行的,并且这个副本在修改过程中是不可视的。只有当修改完成时,被修改的结构才会自动地与主数据结构进行狡猾,之后读取者就可以看到这个修改了。CopyOnWriteArrayList中,写入将导致创建整个底层数组的副本,...原创 2018-05-29 20:27:07 · 470 阅读 · 0 评论 -
第21章并发(二)
21.4.4 检查中断 1、当在线程上调用interrupt()时,中断发生的唯一时刻是在任务要进入到阻塞操作中,或者已经在阻塞操作内部时。 2、可以通过调用interruped()来检查中断状态,不仅可以知道interrupt()是否被调用过,而且还可以清楚中断状态。清楚中断状态可以确保并发结构不会就某个任务被中断这个问题通知两次。package com21下;import ja...原创 2018-05-24 22:38:26 · 185 阅读 · 0 评论 -
并发---共享受限资源
可以把单线程程序当做在问题域求解的单一实体,每次只能做一件事情。因为只有一个实体,所以永远不用担心诸如“两个实体试图同时使用同一个资源”。并发就可以同时做多件事情了,但是,两个或多个线程彼此互相干涉的问题也就出现了。不正确地访问资源import java.util.concurrent.ExecutorService;import java.util.concurrent.E...原创 2018-06-04 22:30:33 · 370 阅读 · 0 评论 -
并发--性能调优(一) Synchronized Lock Atomic类比较
性能调优互斥技术。 Synchronized Lock Atomic类比较Synchronized 和Lock简单性能测试package com21并发1;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * Created by Panda...原创 2018-05-28 21:42:23 · 678 阅读 · 0 评论 -
并发---加入一个线程 join
join一个线程可以在其他线程之上调用join()方法,其效果是等待一段时间直到第二个线程结束才继续执行。如果某个线程在另一个线程t上调用t.join(),此线程将被挂起,直到目标线程t结束才恢复(即t.isAlive()返回为假)也可以在调用join()时带上一个超时参数(单位可以是毫秒,或者毫秒和纳秒),这样如果目标线程在这段时间到期时还没有结束的话,join()方法总能返回。对jo...原创 2018-06-04 22:09:25 · 387 阅读 · 0 评论 -
并发----使用Executor
使用ExecutorExecutor管理Thread对象,从而简化了并发编程。Executor在客户端和任务执行之间提供了一个间接层;与客户端直接执行任务不同,这个中介对象将执行任务。Executor允许管理一部任务的执行,而无须显式地管理线程的声明周期。import java.util.concurrent.ExecutorService;import java.util.con...原创 2018-06-04 21:50:41 · 235 阅读 · 0 评论 -
并发---仿真(银行出纳员仿真 )
仿真通过使用并发,仿真的每个构件都可以成为其自身的任务,这使得仿真更容易编程。银行出纳员仿真可以表示任何属于以下的情况:对象随机地出现,并且要求由数量有限的服务器提供随机数量的服务时间。通过构建仿真可以确定理想的服务器数量。package com21仿真;import java.util.LinkedList;import java.util.Priority...原创 2018-05-30 18:46:34 · 352 阅读 · 0 评论 -
并发-(分发工作)
分发工作考虑一个假想的用于汽车的机器人组装线,每辆Car都将分多个阶段构建,从创建底盘开始,紧跟着是安装发动机、车厢和轮子。package com21仿真;import java.util.HashSet;import java.util.Set;import java.util.concurrent.*;/** * Created by Panda on 2018/...原创 2018-05-30 19:39:27 · 363 阅读 · 0 评论 -
并发-----死锁
形成死锁的四个条件互斥条件。任务使用的资源至少有一个是不能共享的。请求与保持条件。至少有一个任务必须持有一个资源且正在等待获取一个当前被别的任务持有的资源。不可剥夺条件。资源不能被任务抢占,任务必须把资源释放当做普通事件。循环等待条件。一个任务等待其他任务所持有的资源,后者又在等待另一个任务所持有的资源。/** * Created by Panda on 2018/6/6. ...原创 2018-06-06 16:31:35 · 171 阅读 · 0 评论 -
内部类(六)---嵌套类
如果不需要内部类与其外围类对象之间有联系,可以将内部类声明为static。通常称为嵌套类。普通的内部类对象隐式地保存了一个引用,指向创建它的外围类对象。嵌套类意味着:①要创建嵌套类的对象,并不需要其外围类的对象。②不能从嵌套类的对象中访问非静态的外围类对象。嵌套类和外围类还有一个区别:普通内部类的字段与方法,只能放在类的外部层次上,所以普通的内部类不能有static数据和static字段,...原创 2018-06-10 20:33:54 · 230 阅读 · 0 评论 -
内部类(五)----再访工厂方法
/** * Created by Panda on 2018/6/10. */interface Service{ void method1(); void method2();}interface ServiceFactory{ Service getService();}//Implementation1构造器是私有的class Implementati...原创 2018-06-10 19:40:50 · 287 阅读 · 0 评论 -
内部类(四) 匿名内部类
匿名内部类 上述的匿名内部类的语法是下述形式的简化形式 注意:如果定义一个匿名内部类,并且希望它使用一个在其外部定义的对象,那么编译器会要求其参数引用是final的。/** * Created by Panda on 2018/6/8. *///在匿名类中不可能有命名构造器(因为它根本没名字),但通过实例初始化,就能够达到为匿名 //内部类创建一个构造器的效果...原创 2018-06-08 22:09:59 · 215 阅读 · 0 评论 -
内部类(三)在方法和作用域内的内部类
在方法和作用域内的内部类可以在一个方法里面或者在任意的作用域内定义内部类。理由: ①实现了某类型的接口,于是可以创建并返回对其的引用。 ②要解决一个复杂的问题,想创建一个类来辅助你的解决方案,但是又不希望这个类是公共可用的。①一个定义在方法中的类。 ②一个定义在作用域内的类,此作用域在方法的内部。 ③一个实现了接口的匿名类。 ④一个匿名类,它扩展了有非默认构造器的类。 ⑤一个匿...原创 2018-06-08 21:00:54 · 512 阅读 · 0 评论 -
内部类(二) 使用.this与.new & 内部类与向上转型
使用.this与.new如果需要生成对外部类对象的引用,可以使用外部类的名字后面紧跟圆点和this。 有时候需要告知某些其他对象,去创建其某个内部类的对象。需要在new表达式中提供对其他外部类对象的引用,这时需要使.new语法。 要想直接创建内部类的对象,不能按照想象的方式,去引用外部类的名字DotNew,而是必须使用外部类的对象来创建该内部类对象。在拥有外部类对象之前是不可能创建...原创 2018-06-08 20:23:27 · 263 阅读 · 0 评论 -
并发-Semaphore
Semaphore正常的锁在任何时刻都只允许一个任务访问一项资源,而计数信号量允许n个任务同时访问这个资源。还可以将信号量看作是在向外分发使用资源的“许可证”,尽管实际上没有使用任何许可证对象。对象池的概念,管理者数量有限的对象,当要使用对象时可以迁出它们,而在用户使用完毕时,可以将它们迁回。package com21concurrent;import java.util.A...原创 2018-06-01 22:23:14 · 137 阅读 · 0 评论 -
并发---使用ScheduledExecutor的温室控制器
ScheduledExecutorScheduledThreadPoolExecutor。通过使用schedule()(运行一次任务)或者scheduleAtFixedRate()(每隔规则的时间重复执行任务)。可以将Runnable对象设置为在将来的某个时刻执行。package com21concurrent;import java.util.*;import java....原创 2018-06-01 21:43:11 · 249 阅读 · 0 评论 -
并发-新类库中的构件 PriorityBlockingQueue
PriorityBlockingQueue基础的优先级队列,具有可阻塞的读取操作。优先级队列 中的对象是按照优先级顺序从队列中出现的任务。package com21concurrent;import java.util.ArrayList;import java.util.List;import java.util.Queue;import java.util.Rando...原创 2018-06-01 20:46:13 · 194 阅读 · 0 评论 -
并发-新类库中的构件 DelayQueue
DelayQueue无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走。这种队列是有序的,即队头对象的延迟到期的时间最长。如果没有任何延迟到期 ,那么就不会有任何头元素,并且poll()将返回null。(正因为这样,不能讲null放置到这种队列中)package com21concurrent;import jav...原创 2018-06-01 20:08:52 · 209 阅读 · 0 评论 -
并发-新类库中的构件 CyclicBarrier
CyclicBarrier适用于如下情况:创建一组任务,并行执行工作,然后在进行下一个步骤之前等待,直至所有任务都完成(看起来有些像join())。它使得所有的并行任务都将在栅栏处列队,而CyclicBarrier可以多次重用。赛马游戏package com21concurrent;import java.util.ArrayList;import java.util.Li...原创 2018-06-01 16:51:30 · 235 阅读 · 0 评论 -
内部类(一)创建内部类&链接到内部类
内部类可以将一个类的定义放在另一个类的定义内部,这就是内部类。内部类是一种非常有用的特性,因为它允许你把一些逻辑相关的类组织在一起,并控制位于内部的类的可视性。创建内部类创建内部类:把类的定义置于外围类的里面;package com2001;/** * Created by Panda on 2018/6/8. */public class Parcel1 {...原创 2018-06-08 15:09:56 · 254 阅读 · 0 评论 -
并发-新类库中的构件 CountDownLatch
CountDownLatch用来同步一个或多个任务,强制它们等待由其他任务执行的一组操作完成。可以向CountDownLatch对象设置一个初始计数值,任何在这个对象上调用wait()的方法都将阻塞,直至这个计数值到达0。其他任务在结束其工作时,可以在该对象上调用countDown()来减小这个计数值。CountDownLathc被设计为只触发一次,计数值不能被重置。如果需要能够重置计数值...原创 2018-06-01 15:25:52 · 169 阅读 · 0 评论 -
并发---概念总结
并发通常是提高运行在单处理器上的程序的性能。在单个处理器上运行的并发程序开销确实应该比该程序的所有部分都顺序执行的开销大,因为其中增加了所谓上下文切换的代价(从一个任务切换到另一个任务)。表面上看,将程序的所有部分当做单个的任务运行好像是开销更小一点,并且可以节省上下文切换的代价。使这个问题变得有些不同的是阻塞。如果使用并发来编写程序,那么当一个任务阻塞时,程序中的其他任务还可以继续执行,因...原创 2018-06-04 19:45:17 · 209 阅读 · 0 评论 -
并发--活动对象
活动对象概念: 活动对象或者行动者:每个对象都维护着自己的工作期线程和消息队列,并且所有对这种对象的请求都将进入队列排队,任何时刻都只能运行其中的一个。因此,有了活动对象,就可以串行化消息而不是方法,意味着不再需要防备一个任务在其循环的中间被中断这种问题。用处: 当向一个活动对象发送消息时,这条消息会转变为一个人任务,该任务会被插入到这个对象的队列中,等待在以后的某个时刻运行。示例:...原创 2018-05-28 20:20:01 · 352 阅读 · 0 评论 -
第一章对象导论
1.1抽象过程 1、所有编程语言都提供抽象机制。人们所能够解决的问题的复杂性直接取决于抽象的类型和质量。 2、程序可以通过添加新类型的对象使自身适用于某个特定问题。 3、OOP允许根据问题来描述问题,而不是根据运行解决方案的计算机来描述问题。 4、①万物皆为对象。 ②程序是对象的集合,它们通过发送消息来告知彼此所要做的。 ③每个对象都有自己的由其他对象所构成的存储。(可以通...原创 2018-05-07 21:52:20 · 181 阅读 · 0 评论 -
第19章枚举类型
1、关键字enum可以将一组具名的值的有限集合创意为一种新的类型,而这些具有的值可以作为常规的程序组件使用。 19.1 基本enum特性 1、package com19;/** * Created by Panda on 2018/5/20. */enum Shrubbery{GROUND,CRAWLING,HANGING}public class EnumClass {...原创 2018-05-20 21:50:41 · 242 阅读 · 0 评论 -
第13章字符串
13.1不可变String 13.2 重载“+”与StringBuilder 1、String对象是不可变的,可以给一个String对象加任意多的别名。因为String对象具有只读特性,所以指向它的任何引用都不可能改变它的值,因此,也就不会对其他的引用有什么影响。 13.3无意识的递归 1、容器类都有toString()方法,并且覆写了该方法,使得它生成的String结果能够表达容器自身,...原创 2018-05-13 20:48:56 · 237 阅读 · 0 评论 -
第18章 Java I/O系统
18.1 File类 1、File(文件)类这个名字有一定的误导性。认为它指代的是文件,实际上却并非如此。它既能代表一个特定文件的名称,又能代表一个目录下的一组文件的名称。如果它指的是一个文件集,就可以对此集合调用list()方法,这个方法会返回一个字符数组。如果想取得不同的目录列表,只需要再创建一个不同的File对象就可以了。 18.1.1目录列表器 1、想查看一个目录列表,可以用两种方法...原创 2018-05-18 22:16:48 · 148 阅读 · 0 评论 -
第12章通过异常处理错误
12.1概念 1、使用异常能够降低错误处理代码的复杂度。 12.2基本异常 1、异常情况是指阻止当前方法或作用域继续执行的问题。把异常情形与普通问题相区分很重要,所谓的普通问题是指,在当前环境下能得到足够的信息,总能处理这个错误。对于异常情形,就不能继续下去了,因为在当前环境下无法获得必要的信息来解决问题。 2、异常允许强制程序停止运行,并告诉出现什么了什么问题,或者(理想状态下)强制程序...原创 2018-05-11 22:41:04 · 234 阅读 · 0 评论 -
第11章持有对象
1、如果一个程序只包含固定数量的且其生命周期都是已知的对象,那么这是一个非常简单的程序。 11.1泛型和类型安全的容器 1、注解以@符号开头,可以接受参数,这里的@SuppressWarnings注解极其参数表示只有有关“不受检查的异常”的警告信息应该被抑制。 2、当指定了某个类型作为泛型参数时,并不仅限于只能将该确切类型的对象放置到容器中。向上转型也可以像作用于其他类型一样作用于泛型。 ...原创 2018-05-11 22:40:37 · 165 阅读 · 0 评论 -
第17章 容器深入研究
17.1完整的容器分类法 17.2填充容器 17.2.1 一种Generator解决方案package com17;import java.util.ArrayList;/** * Created by Panda on 2018/5/17. */interface Generator&lt;T&gt;{ T next();}public class Collecti...原创 2018-05-17 22:39:18 · 207 阅读 · 0 评论 -
第10章内部类
1、可以将一个类的定义放在另一个类的定义内部,这就是内部类。 2、内部类是一种非常有用的特性,因为它允许把一些逻辑相关的类组织在一起,并控制位于内部的类的可见性。 10.1 创建内部类 1、如果从外部类的非静态方法之外的任意位置创建某个内部类的对象,那么必须像在main方法中那样,具体地只能这个对象的类型 OuterClassName.InnerClassName 10.2 链接到外部类 ...原创 2018-05-10 22:27:09 · 243 阅读 · 0 评论 -
第九章接口
1、接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法。 9.1 抽象类和抽象方法 1、包含抽象方法的类叫做抽象类。如果一个类包含一个或多个抽象方法,该类必须被限定为抽象的。 2、如果从一个抽象类继承,并向创建该新类的对象,那么就必须为基类中的所有抽象方法提供方法定义。如果不这么样做(可以选择不做),那么导出类便也是抽象类,且编译器将会强制用abstract关键字来限定这个类。 ...原创 2018-05-10 22:26:42 · 201 阅读 · 0 评论