Java编程思想 并发Concurrent Synchronize Executor多线程 阻塞队列BlockingQueue使用总结
进程(process)和线程(thread)
实现并发最直接的方式是在操作系统级别使用进程。进程是运行在它自己的地址空间内的自包容的程序。
一个线程就是在进程中的一个单一的顺序控制流,单个进程可以拥有多个并发执行任务。
Runnable和Thread
通过Runnable
定义任务
线程可以驱动任务,Java中是由Runnable
接口提供,需要实现Runnable
接口的run()
方法。任务run()
方法通常总会有某种形式的循环,使得任务一直运行下去直到不再需要。通常run()
被写成无限循环的形式。
例如:
public class LiftOff implements Runnable {
protected int countDown = 10; //倒计数
private static int taskCount;
private final int id = taskCount ++;
public LiftOff() {
super();
}
public LiftOff(int countDown) {
super();
this.countDown = countDown;
}
public String status() {
return String.format("#%d(%s).", id, (countDown > 0) ? countDown : "LiftOff!");
}
@Override
public void run() {
while(countDown-- > 0) {
System.out.print(status());
Thread.yield();
}
}
}
静态方法Thread.yield()
Thread.yield()
对线程调度器的一种建议,暗示:我已经执行完生命周期中最重要的部分了,现在正是将CPU资源切换给其他任务执行一段时间的时机。
Thread类
将Runnable
对象转变为工作任务的传统方式是将它提交给一个Thread
的构造器。
使用方法如下:
public class BasicThreads {
public static void main(String[] args) {
Thread t = new Thread(new LiftOff());
t.start();
System.out.println("Waiting for LiftOff");
}
}
Executor和线程池
Executor
是Java SE5引入的,用来管理Thread
对象,从而简化并发编程。Executor是启动任务的优选方法
ExecutorService
ExecutorService
是具有生命周期的Executor
,会管理如何构建恰当的上下文来执行Runnable
对象。非常常见的情况是:单个Executor
用来创建和管理系统中所有的任务。
在任何线程池中,在现有的线程的可能情况下,都会被自动复用
CachedThreadPool
CachedThreadPool
为每个任务都创建一个线程,使用方法:
public class CachedThreadPool {
public static void main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPool();
for(int i = 0; i < 5; i ++) {
exec.execute(new LiftOff());
}
exec.shutdown();
}
}