并发编程CAS
首先搞明白什么是并发编程?
并发编程是指在一台机器上同时处理多个任务。并发是指在同一个实体上的多个事件。多个事件在同一时间间隔发生。
为什么需要并发编程(多线程编程)?
有很多耗时的工作,如上传下载文件、与客户聊天需要建立长时间连接等。这时,一个线程是满足不了的,会因资源独占产生过多的等待 ,因此需要多线程编程。
如果使用并发来编写程序,当一个任务阻塞时,程序中的其他任务还可以继续执行,因此这个任务还可以继续保持向前执行。
java的线程机制是抢占式的,这表示调度机制会周期性的中断线程,将上下文切换到另一个线程,从而为每个线程都提供时间片,使得每个线程都会分配到数量合理的时间去驱动它的任务。线程可以驱动任务,定义任务要实现Runnable()接口并编写run()方法,使得改任务可以执行你的命令。
public class LiftOff implements Runnable{
protected int countDown=10;
private static int taskCount=0;
private final int id=taskCount++;
public LiftOff(){}
public LiftOff(int countDown){
this.countDown=countDown;
}
public String status(){
return "#"+id+"("+(countDown>0? countDown:"LiftOff!")+")";//id可以区分任务的多个实例
}
public void run() {
while(countDown-- >0){
System.out.println(status());
Thread.yield();//线程调度器
}
}
}
Executor管理Thread对象,在客户端和任务执行之间提供了一个间接层,将由这个对象执行任务而不是客户端执行任务,允许你管理异步任务的执行,无须显式地管理线程的生命周期。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CachedThreadPool {
public static void main(String[] args) {
ExecutorService exec=Executors.newCachedThreadPool(); //FixedThreadPool使用了有限的线程集来执行所提交的任务
for(int i=0;i<5;i++){
exec.execute(new LiftOff());
}
exec.shutdown();
}
}
结果为:
#1(9)
#0(9)
#3(9)
#2(9)
#3(8)
#2(8)
#3(7)
#2(7)
#1(8)
#2(6)
#3(6)
#0(8)
#4(9)
#4(8)
#4(7)
#4(6)
#4(5)
#4(4)
#4(3)
#4(2)
#4(1)
#4(LiftOff!)
#0(7)
#3(5)
#3(4)
#3(3)
#3(2)
#3(1)
#2(5)
#1(7)
#1(6)
#1(5)
#1(4)
#1(3)
#1(2)
#1(1)
#1(LiftOff!)
#2(4)
#3(LiftOff!)
#0(6)
#0(5)
#0(4)
#0(3)
#0(2)
#0(1)
#0(LiftOff!)
#2(3)
#2(2)
#2(1)
#2(LiftOff!)
CachedThreadPool在程序执行过程中通常会创建与所需数量相同的线程,在它回收旧线程时停止创建新线程。