Java 基础

集合类型:

  1. MAP接口:HashMap、HashTable、HashSet、SynchronizeMap、、ConcurrentHashMap
// HashMap 实现Map是一个Hash表,线程不安全的,PUT机制是根据Key的值计算HashCode决定存放在Hash表的哪个位置
public class HashMap<K,V>
    extends AbstractMap<K,V>
    implements Map<K,V>, Cloneable, Serializable

// 是一个Dictionary 线程安全的,算定整个Table进行操作
public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable {

// 可以理解成HashTable和HasMap的结合,每个Segment是一个Map,锁定整个segment进行操作
public class ConcurrentHashMap<K, V> extends AbstractMap<K, V>
        implements ConcurrentMap<K, V>, Serializable {

//synchronizedMap: 线程安全的HashMap,提供方法级锁
Map<String, String> synchronizedHashMap = Collections.synchronizedMap(new HashMap<String, String>());
 

ConcurrentHashMap

 

  1. Queue<T>: FIFO从队尾进、队头出

 实现没有阻塞的Queue 如LinkList<T>、PriorityQueue<T>、ConcurrentLinkedQueue<T>

实现阻塞的Queue 如ArrayBlockingQueue LinkedBlockingQueue PriorityBlockingQueue DelayQueue SynchronousQueue 
Blocking Queue的实现原理 是先获取锁再操作

final ReentrantLock lock = this.lock;
lock.lockInterruptibly();

线程:

  • 线程:
    1。多线程:线程是现代CPU的最小调度单位http://www.importnew.com/21907.html

    2。举例: 单线程程序简单明了,但有时无法满足特定的需求。如一个文字处理的程序,我在打印文章的同时也要能对文字进行编辑,如果是单线程的程序则要等打印机打印完成之后你才能对文字进行编辑,但打印的过程一般比较漫长,这是我们无法容忍的。如果采用多线程,打印的时候可以单独开一个线程去打印,主线程可以继续进行文字编辑。在程序需要同时执行多个任务时,可以采用多线程。

    3。实例:计数器、火车票出售、ATM存取款

  • 线程池:

     http://www.blogjava.net/stevenjohn/archive/2011/12/12/366161.html

       http://www.importnew.com/19919.html

1。设计目的:防止线程的创建、销毁对系统资源的消耗

2。组成: 线程管理器(创建线程池,销毁线程池,添加新任务)、工作线程(可以循环执行任务的线程,在没有任务时将等待)、任务接口(为所有任务提供统一的接口,以便工作线程处理。任务接口主要规定了任务的入口,任务执行完后的收尾工作,任务的执行状态等)

3。使用场景:大量短小线程的系统

初始化:

ThreadPoolExecutor(int corePoolSize, 
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue
RejectedExecutionHandler handler)
 
corePoolSize: 线程池维护线程的最少线程数,也是核心线程数,包括空闲线程
maximumPoolSize: 线程池维护线程的最大线程数
keepAliveTime: 线程池维护线程所允许的空闲时间
unit: 程池维护线程所允许的空闲时间的单位
workQueue: 线程池所使用的缓冲队列
handler: 线程池对拒绝任务的处理策略
 
当一个任务通过execute(Runnable)方法欲添加到线程池时:
1、 如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。
2、 如果此时线程池中的数量等于 corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。
3、如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。
4、 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务。也就是:处理任务的优先级为:核心线程corePoolSize、任务队列workQueue、最大线程 maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。
5、 当线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。

异常种类

Checked,Unchecked。Checked 继承自Exception类,Unchecked继承自RuntimeException 

Checked异常要显示捕获、能传递到方法外。Unchecked不需要显示捕获。

消息机制:

原文地址:https://www.cnblogs.com/ygshen/p/5422219.html