首先搞明白什么是并发编程?
并发编程是指在一台机器上同时处理多个任务。并发是指在同一个实体上的多个事件。多个事件在同一时间间隔发生。
为什么需要并发编程(多线程编程)?
有很多耗时的工作,如上传下载文件、与客户聊天需要建立长时间连接等。这时,一个线程是满足不了的,会因资源独占产生过多的等待 ,因此需要多线程编程。
如果使用并发来编写程序,当一个任务阻塞时,程序中的其他任务还可以继续执行,因此这个任务还可以继续保持向前执行。
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在程序执行过程中通常会创建与所需数量相同的线程,在它回收旧线程时停止创建新线程。
时间: 2024-10-06 02:19:28