Annotation
元注解
元注解 | 解释 |
---|---|
@Target | 表示注解用于什么地方。可能的ElementType参数包括:CONSTRUCTOR: 构造器声明 FIELD: 域声明(包括enum实例),LOCAL_VARIABLE:局部变量声明,METHOD: 方法声明,PACKAGE:包声明。PARAMETER: 参数说明,TYPE: 类、接口(包括注解类型)或enum声明。 |
@Retention | 表示需要在什么级别保存该注解信息。可选的RetentionPolicy参数包括:SOURCE: 注解将被编译器丢弃,CLASS:注解在class文件中可用,但会被VM丢掉,RUNTIME:VM在运行期也会保留注解,因此可以通过反射机制读取注解 |
@Documented | 将此注解包含在Javadoc中 |
@Inherited | 允许子类继承父类中的注解 |
注解元素可用类型
- 所有基本类型(int,float,boolean)等
- String
- Class
- enum
- Annotation
- 以上类型的数组
如果过你使用了其它类型,编译器会报错. 注意,也不能使用任何包装类,不过 由于自动打包的存在,这算不上什么限制。注解也可以作为元素类型,也就是说注解可以 嵌套,这是很有用的一个技巧.
默认值限制
- 元素不能有不确定的值,元素要么具有值,要么在使用时提供元素的值.
- 非基本类型的元素,注解接口中定义的值不能为null. 一般用空字符串,或负数来表示元素不存在.
注解不支持继承
- 不能使用关键字extends来继承@interface的注解.
访问者设计模式
一个访问者会遍历某个数据结构或一个对象的集合,对其中的每一个对象执行一个操作。该数据结构 无需有序,而你对每个对象执行的操作,都是特定于此对象的类型。这就将操作与对象解耦,也就是说,你可以添加新的操作,而无需向类的定义中添加方法.
并发
基本的线程机制
并发编程使程序划分多个分离的、独立的运行的任务。通过多线程这些独立的任务中的每一由都将有执行线程来驱动。
一个线程就是在进程中的一个单一的顺序控制流,因此单个进程可以拥有多个并发执行的任务,但是你的 程序使得每个任务好像有其自己的cpu一样。其底层机制是切分cpu时间,但通常你不需要考虑它。
- 时间片机制. cpu轮流给每个任务分配时间片,使得人们看起来它们都在运行。
从Runnable导出一个类时,它必须具有run()方法,但是该方法并无特殊之处,它不会产生任何内在的线程能力。 要实现线程行为你必须将一个任务附着到线程上.
将一个Runnable对象转换为一个工作任务的传统方式就是把它交给一个Thread() 构造器。通过调用 Thread的start()方法来为该线程执行必须的初始化操作,start会立即返回,然后Runnable在调用run()方法,以便在 这个新线程中启动该任务.
java.util.concurrency.Executors 执行器.
- Executors 在客户端和执行任务之间提供了一个间接层;与客户端直接执行任务不同,这个中介任务将执行。
- Executors 允许你管理异步任务的执行,而无需显示的管理线程的生命周期.
- Executors 是启动任务的优选方法.
ExecutorService,(具有生命周期的Executor,例如关闭)知道如何构建恰当的上下文来执行Runnable对象。
// 使用静态的Executor方法构建ExecutorService
ExecutorService exec = Executor.newCachedThreadPool();
Executor线程池静态方法
在任何线程池中,现有线程在可能的情况下,都会被自动复用.
method | description |
---|---|
newCachedThreadPool | 将为每个任务创建一个线程,然后在它回收旧线程时停止创建新线程,因此它是合理的Executor首选,只有当这种方式会引发问题时,你才需要切换到FixedThreadPool |
newFixedThreadPool(5) | 使用有限线程集来执行所提交的任务,可以一次性预先执行代价高昂的线程分配,因而也就可以限制线程的数量。这对于你希望在另一个线程中连续运行的任何事物(长期存活的任务)来说,是很有用的 |
newSingleThreadPool | 就像是FixedThreadPool(1),它还提供了一种重要的并发机制,其它线程不会被并发调用。提交多个任务将排队,每个任务都会在下一个任务运行开始之前运行结束,所有任务都是用相同的线程. |
Thread 相关静态方法
name | description |
---|---|
Thread.yield() | 调用yield(),对线程调度器(java线程机制的一部分,可以将cpu从一个线程转移给另一个线程)的一种建议。 它在声明:我已经执行完生命周期中最重要的部分,此刻正是切换给其他任务执行的大好时机. |