0xACED
通过 LinkedHashMap 来实现
线程池是指在初始化一个多线程应用程序过程中创建一个线程集合,然后再需要执行新的任务时重用这些线程而不是新建一个线程。线程池中线程的数量通常完全取决于可用内存数量和应用程序的需求。然而,增加可用线程数量是可能的。线程池中的每个线程都有被分配一个任务,一旦任务已经完成了,线程回到线程池中等待下一次分配任务。
一个线程池包括四个基本组成部分
- 线程管理器:用于创建并管理线程池,包括创建线程池,销毁线程池,添加新任务;
- 工作线程:线程池中线程,在没有任务的时候处于等待状态,可以循环的执行任务;
- 任务接口:每个任务必须实现的接口,以供工作线程调度任务的执行,它主要规定了任务的入口,任务执行完后的收尾工作,任务的执行状态等;
- 任务队列:用于存放没有处理的任务,提供一种缓存机制。
1.start方法
用start 方法来启动线程,是真正实现了多线程。通过调用Thread类的start方法来启动一个线程,这个线程处于就绪状态,并没有运行,一旦得到cpu时间片,就开始执行run方法。但要注意的是,此时不需要等待run方法执行完毕,可以继续执行下面的代码,所以run方法没有实现多线程。
2.run方法
run方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,只有等run方法执行完毕后才可以执行下面的代码。
1)执行父类静态代码块
2)执行子类的静态代码块
3)执行父类的构造代码块
4)执行父类的构造函数
5)执行子类的构造代码块
6)执行子类的构造函数
for(条件1;条件2;条件3) {
//语句
}
执行顺序:条件1=》条件2=》语句=》条件3=》条件2=》语句=》条件3.。。
public方法:getClass, equals, hashCode, toString, t, notify
protected方法:clone, finalize
private方法:registerNatives
单例模式保证只有一个实力存在。有时候单例是为了避免重复创建多个单例造成资源浪费,有时候也是为了避免多个不同的单例导致系统不一致的行为。
Class Singleton {
private volatile static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
- HashMap允许键和值是null,HashTable则不允许
- HashTable是同步的,而HashMap则不是,因此,HashMap更适合单线程环境
- 对两者而言,在列尾末尾增加一个元素所花的开销都是固定的。
- 在 ArrayList 的中间插入或删除一个元素意味着列表剩余的元素都需要移动;而在 LinkedList 中间插入或者删除一个元素的开销都是固定的。
- LinkedList 不支持高效的随机元素访问。
- ArrayList 的空间浪费主要是在结尾预留一定的空间,而 LinkedList 的空间花费体现在每一个元素的开销。
Java运行时环境(JRE)。它包括Java虚拟机、Java核心类库和支持文件。它不包含开发工具(JDK)--编译器、调试器和其他工具。 Java开发工具包(JDK)是完整的Java软件开发包,包含了JRE,编译器和其他的工具(比如:JavaDoc,Java调试器),可以让开发者开发、编译、执行Java应用程序。
“static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。 Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。 java中也不可以覆盖private的方法,因为private修饰的变量和方法只能在当前类中使用,如果是其他的类继承当前类是不能访问到private变量或方法的,当然也不能覆盖。
- 当新对象被创建的时候,构造方法会被调用。每一个类都有构造方法。在程序员没有给类提供构造方法的情况下,Java编译器会为这个类创建一个默认的构造方法。
- Java中构造方法重载和方法重载很相似。可以为一个类创建多个构造方法。每一个构造方法必须有它自己唯一的参数列表。
编辑器自动完成从 Generic Java 到普通 Java 的翻译,转换过程包括:
- 将参数化类型中的类型参数“擦除”掉
- 将类型变量用“上限”取代,通常情况下这些上限是 Object。
- 添加类型转换并插入桥方法,以便覆盖可以正常的工作。
通俗地来说,加锁的就是线程安全的,不加锁的就是线程不安全的。
多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其它线程无法访问。直到线程读取完毕,其它线程才能使用。不会出现数据不一致或者数据污染。
不提供数据访问保护,有可能出现多个线程修改数据从而导致脏数据。