自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(64)
  • 收藏
  • 关注

原创 内部类(十)局部内部类&内部类标识

局部内部类局部内部类不能有访问说明符,因为不是外围类的一部分,但是可以访问当前代码块内的常量,以及此外围类的所有成员。局部内部类的名字在方法外是不可见的,为什么仍然使用局部内部类而不是匿名内部类呢?唯一理由是:需要一个已命名的构造器,或者需要重载构造器,而匿名内部类只能用于实例初始化。package com2002;/** * Created by Panda on 201...

2018-06-11 16:25:58 308

原创 内部类(九)----内部类的继承&内部类可以覆盖嘛

内部类的继承因为内部类的构造器必须连接到指向其外围类对象的引用,所以在继承内部类的时候,会很复杂。问题在于:那个指向外围类对象的引用必须被初始化,而在导出类中不再存在可连接的默认对象。 内部类可以被覆盖嘛?package com2002;/** * Created by Panda on 2018/6/11. */class Egg { private ...

2018-06-11 16:12:34 932

原创 内部类(八)----内部类与控制框架

应用程序框架就是被设计用以解决某类特定问题的一个类或一组类。要运用某个应用程序框架,通常是继承一个或多个类,并覆盖某些方法。在覆盖后的方法中,编写代码定制应用程序框架提供的通用解决方案。内部类允许: ①控制框架的完整实现是由单个的类创建的,从而实现的细节被封装了起来。内部类用来表示解决问题所必须的各种不同的action。 ②内部类能够很容易地访问外围类的任意成员,所以可以避免这种实现变得笨...

2018-06-11 15:18:29 437

原创 内部类(七)---为什么需要内部类

需要内部类原因:内部类继承自某个类或实现某个接口,内部类的代码操作创建它的外围类的对象。可以认为内部类提供了某种进入其外围类的窗口。每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。 1)内部类可以有多个实例,每个实例都有自己的状态信息,并且与其外围类对象的信息相互独立。 2)在单个外围类中,可以让多个内部类以不同的方...

2018-06-10 22:16:00 276

原创 内部类(六)---嵌套类

如果不需要内部类与其外围类对象之间有联系,可以将内部类声明为static。通常称为嵌套类。普通的内部类对象隐式地保存了一个引用,指向创建它的外围类对象。嵌套类意味着:①要创建嵌套类的对象,并不需要其外围类的对象。②不能从嵌套类的对象中访问非静态的外围类对象。嵌套类和外围类还有一个区别:普通内部类的字段与方法,只能放在类的外部层次上,所以普通的内部类不能有static数据和static字段,...

2018-06-10 20:33:54 204

原创 内部类(五)----再访工厂方法

/** * 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 262

原创 内部类(四) 匿名内部类

匿名内部类 上述的匿名内部类的语法是下述形式的简化形式 注意:如果定义一个匿名内部类,并且希望它使用一个在其外部定义的对象,那么编译器会要求其参数引用是final的。/** * Created by Panda on 2018/6/8. *///在匿名类中不可能有命名构造器(因为它根本没名字),但通过实例初始化,就能够达到为匿名 //内部类创建一个构造器的效果...

2018-06-08 22:09:59 185

原创 内部类(三)在方法和作用域内的内部类

在方法和作用域内的内部类可以在一个方法里面或者在任意的作用域内定义内部类。理由: ①实现了某类型的接口,于是可以创建并返回对其的引用。 ②要解决一个复杂的问题,想创建一个类来辅助你的解决方案,但是又不希望这个类是公共可用的。①一个定义在方法中的类。 ②一个定义在作用域内的类,此作用域在方法的内部。 ③一个实现了接口的匿名类。 ④一个匿名类,它扩展了有非默认构造器的类。 ⑤一个匿...

2018-06-08 21:00:54 479

原创 内部类(二) 使用.this与.new & 内部类与向上转型

使用.this与.new如果需要生成对外部类对象的引用,可以使用外部类的名字后面紧跟圆点和this。 有时候需要告知某些其他对象,去创建其某个内部类的对象。需要在new表达式中提供对其他外部类对象的引用,这时需要使.new语法。 要想直接创建内部类的对象,不能按照想象的方式,去引用外部类的名字DotNew,而是必须使用外部类的对象来创建该内部类对象。在拥有外部类对象之前是不可能创建...

2018-06-08 20:23:27 236

原创 内部类(一)创建内部类&链接到内部类

内部类可以将一个类的定义放在另一个类的定义内部,这就是内部类。内部类是一种非常有用的特性,因为它允许你把一些逻辑相关的类组织在一起,并控制位于内部的类的可视性。创建内部类创建内部类:把类的定义置于外围类的里面;package com2001;/** * Created by Panda on 2018/6/8. */public class Parcel1 {...

2018-06-08 15:09:56 204

原创 并发-----死锁

形成死锁的四个条件互斥条件。任务使用的资源至少有一个是不能共享的。请求与保持条件。至少有一个任务必须持有一个资源且正在等待获取一个当前被别的任务持有的资源。不可剥夺条件。资源不能被任务抢占,任务必须把资源释放当做普通事件。循环等待条件。一个任务等待其他任务所持有的资源,后者又在等待另一个任务所持有的资源。/** * Created by Panda on 2018/6/6. ...

2018-06-06 16:31:35 144

原创 并发----任务间使用管道进行输入/输出

通过输入/输出在线程间进行通信通常很有用。在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 280

原创 并发----生产者消费者

生产者与消费者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 173

原创 并发---线程之间的协作

当使用线程来同时运行多个任务时,可以通过使用锁(互斥)来同步两个任务的行为,从而使得一个任务不会干涉另一个任务的资源。也就是说,如果两个任务在交替着不如某项共享资源(通常是内存),可以使用互斥来使得任何时刻只有一个任务可以访问这项资源。wait()与notify()wait()提供了一种在任务之间对活动同步的方式。在wait()期间对象锁是释放的。可以通过notify()、n...

2018-06-05 20:14:53 233

原创 并发----终结任务

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 155

原创 并发---共享受限资源

可以把单线程程序当做在问题域求解的单一实体,每次只能做一件事情。因为只有一个实体,所以永远不用担心诸如“两个实体试图同时使用同一个资源”。并发就可以同时做多件事情了,但是,两个或多个线程彼此互相干涉的问题也就出现了。不正确地访问资源import java.util.concurrent.ExecutorService;import java.util.concurrent.E...

2018-06-04 22:30:33 326

原创 并发---加入一个线程 join

join一个线程可以在其他线程之上调用join()方法,其效果是等待一段时间直到第二个线程结束才继续执行。如果某个线程在另一个线程t上调用t.join(),此线程将被挂起,直到目标线程t结束才恢复(即t.isAlive()返回为假)也可以在调用join()时带上一个超时参数(单位可以是毫秒,或者毫秒和纳秒),这样如果目标线程在这段时间到期时还没有结束的话,join()方法总能返回。对jo...

2018-06-04 22:09:25 348

原创 并发----使用Executor

使用ExecutorExecutor管理Thread对象,从而简化了并发编程。Executor在客户端和任务执行之间提供了一个间接层;与客户端直接执行任务不同,这个中介对象将执行任务。Executor允许管理一部任务的执行,而无须显式地管理线程的声明周期。import java.util.concurrent.ExecutorService;import java.util.con...

2018-06-04 21:50:41 198

原创 并发---概念总结

并发通常是提高运行在单处理器上的程序的性能。在单个处理器上运行的并发程序开销确实应该比该程序的所有部分都顺序执行的开销大,因为其中增加了所谓上下文切换的代价(从一个任务切换到另一个任务)。表面上看,将程序的所有部分当做单个的任务运行好像是开销更小一点,并且可以节省上下文切换的代价。使这个问题变得有些不同的是阻塞。如果使用并发来编写程序,那么当一个任务阻塞时,程序中的其他任务还可以继续执行,因...

2018-06-04 19:45:17 172

原创 并发-Exchanger

ExchangerExchanger是两个任务之间交换对象的栅栏。当这些任务进入栅栏时,各自拥有一个对象,当它们离开时,它们都拥有之前由对象持有的对象。Exchanger的典型应用场景是:一个任务在创建对象,这些对象的生产代价很高昂,而另一个任务在消费这些对象。通过这种方式,可以有更多的对象在被创建的同时被消费。package com21concurrent;import co...

2018-06-02 22:14:09 247

原创 并发-Semaphore

Semaphore正常的锁在任何时刻都只允许一个任务访问一项资源,而计数信号量允许n个任务同时访问这个资源。还可以将信号量看作是在向外分发使用资源的“许可证”,尽管实际上没有使用任何许可证对象。对象池的概念,管理者数量有限的对象,当要使用对象时可以迁出它们,而在用户使用完毕时,可以将它们迁回。package com21concurrent;import java.util.A...

2018-06-01 22:23:14 115

原创 并发---使用ScheduledExecutor的温室控制器

ScheduledExecutorScheduledThreadPoolExecutor。通过使用schedule()(运行一次任务)或者scheduleAtFixedRate()(每隔规则的时间重复执行任务)。可以将Runnable对象设置为在将来的某个时刻执行。package com21concurrent;import java.util.*;import java....

2018-06-01 21:43:11 230

原创 并发-新类库中的构件 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 168

原创 并发-新类库中的构件 DelayQueue

DelayQueue无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走。这种队列是有序的,即队头对象的延迟到期的时间最长。如果没有任何延迟到期 ,那么就不会有任何头元素,并且poll()将返回null。(正因为这样,不能讲null放置到这种队列中)package com21concurrent;import jav...

2018-06-01 20:08:52 173

原创 并发-新类库中的构件 CyclicBarrier

CyclicBarrier适用于如下情况:创建一组任务,并行执行工作,然后在进行下一个步骤之前等待,直至所有任务都完成(看起来有些像join())。它使得所有的并行任务都将在栅栏处列队,而CyclicBarrier可以多次重用。赛马游戏package com21concurrent;import java.util.ArrayList;import java.util.Li...

2018-06-01 16:51:30 205

原创 并发-新类库中的构件 CountDownLatch

CountDownLatch用来同步一个或多个任务,强制它们等待由其他任务执行的一组操作完成。可以向CountDownLatch对象设置一个初始计数值,任何在这个对象上调用wait()的方法都将阻塞,直至这个计数值到达0。其他任务在结束其工作时,可以在该对象上调用countDown()来减小这个计数值。CountDownLathc被设计为只触发一次,计数值不能被重置。如果需要能够重置计数值...

2018-06-01 15:25:52 146

原创 并发-(分发工作)

分发工作考虑一个假想的用于汽车的机器人组装线,每辆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 318

原创 并发---仿真(银行出纳员仿真 )

仿真通过使用并发,仿真的每个构件都可以成为其自身的任务,这使得仿真更容易编程。银行出纳员仿真可以表示任何属于以下的情况:对象随机地出现,并且要求由数量有限的服务器提供随机数量的服务时间。通过构建仿真可以确定理想的服务器数量。package com21仿真;import java.util.LinkedList;import java.util.Priority...

2018-05-30 18:46:34 329

原创 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 837

原创 并发-- 乐观加锁 Atomic and ReadWriteLock

乐观加锁compareAndSet()方法ReadWriteLock对向数据结构相对不频繁地写入,但是有多个任务要经常读取这个数据结构的这类情况进行了优化。ReadWriteLock使得可以同时有多个读取者,只要他们都不视图写入即可。如果写锁已经被其他任务持有,那么任何读取者都不能访问,直至这个写锁被释放为止。 - package com21并发1;import java...

2018-05-29 22:18:51 171

原创 并发--性能调优(三) 比较各种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 304

原创 并发--性能调优(二) 免锁容器 CopyOnWriteArrayList VS synchronized ArrayList

免锁容器免锁容器通用策略:对容器的修改可以与读取操作同时发生,只要读取者只能看到完成修改的结果即可。修改时在容器数据结构的某个部分的一个单独的副本(有时是整个数据结构的副本)上执行的,并且这个副本在修改过程中是不可视的。只有当修改完成时,被修改的结构才会自动地与主数据结构进行狡猾,之后读取者就可以看到这个修改了。CopyOnWriteArrayList中,写入将导致创建整个底层数组的副本,...

2018-05-29 20:27:07 418

原创 并发--性能调优(一) 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 660

原创 并发--活动对象

活动对象概念: 活动对象或者行动者:每个对象都维护着自己的工作期线程和消息队列,并且所有对这种对象的请求都将进入队列排队,任何时刻都只能运行其中的一个。因此,有了活动对象,就可以串行化消息而不是方法,意味着不再需要防备一个任务在其循环的中间被中断这种问题。用处: 当向一个活动对象发送消息时,这条消息会转变为一个人任务,该任务会被插入到这个对象的队列中,等待在以后的某个时刻运行。示例:...

2018-05-28 20:20:01 307

原创 第21章并发(二)

21.4.4 检查中断 1、当在线程上调用interrupt()时,中断发生的唯一时刻是在任务要进入到阻塞操作中,或者已经在阻塞操作内部时。 2、可以通过调用interruped()来检查中断状态,不仅可以知道interrupt()是否被调用过,而且还可以清楚中断状态。清楚中断状态可以确保并发结构不会就某个任务被中断这个问题通知两次。package com21下;import ja...

2018-05-24 22:38:26 163

原创 第21章并发

1、程序中的所有事物在任意时刻都只能执行一个步骤。 21.1并发的多面性 1、并发编程令人困惑的主要原因:使用并发时需要解决的问题有多个,而实现并发的方式也有多种,并且在这两者之间没有明显的映射关系(而且通常只具有模糊的界线)。 21.1.1更快的执行 1、并发通常是提高运行在单处理器上的程序的性能。 2、在单处理器上运行的并发程序开销确实应该比该程序的所有部分都顺序执行的开销大,因为其...

2018-05-22 22:21:51 148

原创 第20章注解

1、注解(也被称为元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便地使用这些数据。 2、注解在一定程度上是把元数据与源代码文件结合在一起,而不是保存在外部文档中这一趋势之下所催生的。 3、@Override 表示当前的方法定义将覆盖超类中的方法。如果拼写错误,或者方法签名对不上被覆盖的方法,编译器就会发出错误提示。 4、@Deprecated 如果使用了...

2018-05-21 21:01:00 1142

原创 整值的整数次方

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方 思路:有以下几个需要注意的地方①base等于0,且exponent等于0的时候没有意义。 ②base是double类型,无法直接与0比较大小,如何处理。③exponent为负数的时候,需要求导。④优化处理,优化求幂函数 当n为偶数,a^n =(a^n/2)(a^n/2) 当n为奇数...

2018-05-21 15:15:28 198

原创 链表中倒数第k个节点

输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个节点。例如一个链表有6个结点,从头结点开始他们的值依次是1,2,3,4,5,6。这个链表的倒数第3个节点是值为4的结点。 思路1:为了得到倒数第k个节点,很自然的想法是先走到链表的尾端,再从尾端回溯K步。可是我们从链表结点的定义看出本题中的链表是单向链表,单向链表的节点只有从前往后的指针...

2018-05-21 15:13:15 166

原创 二进制中一的个数

实现一个函数,输入一个整数,输出该数二进制表示中1的个数,例如把9表示成二进制的1001,有2位是1.因此如果输入9,该函数输出2。 思路1:先判断整数二进制中最右边一位是不是1。接着把输入的整数右移一位,此时原来处于从右边数起的第二位一道最右边,再判断是不是1。这样每次移动一位,直到整个整数变为0为止。问题变成了怎么判断一个整数的最右边是不是1了,这个很简单,只要把整数和1做位与运算看...

2018-05-21 11:19:23 282

空空如也

空空如也

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

TA关注的人

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