线程池的构建:
首先从线程池开始说起:
目前比较快速的构建线程池的方法是:
ExecutorService e = Executors.newCachedThreadPool();
ExecutorService e = Executors.newSingleThreadExecutor();
ExecutorService e = Executors.newFixedThreadPool(3);
// 第一种是可变大小线程池,按照任务数来分配线程,
// 第二种是单线程池,相当于FixedThreadPool(1)
// 第三种是固定大小线程池。
// 然后运行
e.execute(new MyRunnableImpl());
构建好线程之后我们需要做的就是运行任务:
比如我们运行一个给一个值sum进行++运算:
@Override
public void run() {
// System.out.println(currentThread().getName() + " : " + sum++);
ThreadLocal threadLocal = new ThreadLocal();
threadLocal.set(sum);
System.out.println(currentThread().getName() + "_sum : " + sum++);
System.out.println(currentThread().getName() + "_threadLocal : " + threadLocal.get());
}
多线程构建后带来的问题:
线程安全问题:
性能问题:
活跃性问题:
多线程—锁(lock)的作用/使用
线程的原子性:
如何设计一个线程安全的类
队列问题:
阻塞式队列:当一个有边界队列被塞满了的时候队列会阻止生产者继续存放,当队列内无任何内容的时候阻止消费者继续获取;
非阻塞式队列:ConcurrentLinkedQueue 是一个基于链接节点的无界线程安全队列,它采用先进先出(FIFO)的规则对节点进行排序,当我们添加一个元素的时候,它会添加到队列的尾部;当我们获取一个元素时,它会返回队列头部的元素。 入队和出队操作均利用CAS(compare and set)更新,这样允许多个线程并发执行,并且不会因为加锁而阻塞线程,使得并发性能更好。
LIFO:表示后进先出,java栈就是一个实现