首页 > 代码库 > 并发编程CAS

并发编程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在程序执行过程中通常会创建与所需数量相同的线程,在它回收旧线程时停止创建新线程。

并发编程CAS