多线程的一些概念
线程池:线程池主要用来解决线程生命周期开销问题和资源不足问题。
•一个比较简单的线程池至少应包含:
- 线程池管理器:创建、销毁并管理线程池,将工作线程放入线程池中
- 工作线程:一个可以循环执行任务的线程,在没有任务是进行等待
- 任务列队:提供一种缓冲机制,将没有处理的任务放在任务列队中
- 任务接口:每个任务必须实现的接口,主要用来规定任务的入口、任务执行完后的收尾工作、任务的执行状态等,工作线程通过该接口调度任务的执行
代码实现:
class ExecutorThread extends Thread{
boolean runningFlag=false;
private Runnable callBackRunnable=null;
public void setCallBack(Runnable callBack) {
this.callBack=callBack;
}
public synchronized void setRunning(boolean flag) {
runningFlag=false;
if (flag) {
this.notify();
}
}
public synchronized void run() {
try {
while(true) {
if(!runningFlag) {
this.wait();
}
else {
callBack.run();
setRunning(false);
}
}
catch (Exception e) {}
}
}
}
public class ThreadPoolExecutor {
private List<ExecutorThread> threads;
public ThreadPoolExecutor(int threadCount) {
threads=Collections.synchronizedList(new ArrayList<ExecutorThread>());
for (int i = 1; i <=threadCount; i++) {
ExecutorThread thread=new ExecutorThread();
threads.add(thread);
thread.start();
}
}
public void execute(Runnable callBack) {
int i;
for ( i = 0; i < threads.size(); i++) {
ExecutorThread currenyThread=threads.get(i);
if (!currenyThread.runningFlag) {
currenyThread.setCallBack(callBack);
currenyThread.setRunning(true);
return;
}
}
if (i==threads.size()) {
System.out.println("线程资源已用完,请稍等再来申请资源");
}
}
}
信号量的概念与作用:
信号量,有时被称为信号灯,是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。
生产者-消费者模式:•它描述一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从仓库中取走产品
ThreadLocal的作用:
- ThreadLocal用来解决多线程程序的并发问题
- ThreadLocal并不是一个Thread,而是Thread的局部变量,当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本
- 从线程的角度看,目标变量就象是线程的本地变量,这也是类名中“Local”所要表达的意思
ThreadLocal类中的方法:
- void set(T value)将此线程局部变量的当前线程副本中的值设置为指定值
- void remove()移除此线程局部变量当前线程的值
- protected T initialValue()返回此线程局部变量的当前线程的“初始值”
- T get()返回此线程局部变量的当前线程副本中的值
原子操作类:从JDK5之后,Java提供了粒度更细、量级更轻,并且在多核处理器具有高性能的原子操作类。因为原子操作类把竞争的范围缩小到单个变量上,这可以算是粒度最细的情况了。原子操作类相当于泛化的volatile变量,能够支持原子读取-修改-写操作。
原子操作类在Java.util.concurrent.atomic包下,可以分为四种类型的原子更新类:
- 原子更新基本类型
- 原子更新数组类型
- 原子更新引用
- 原子更新属性