我们实现线程的一般方式是一个类实现Runnable接口,再new Thread(new Runnable).start();
自从JDK5之后,sun公司在java.util.concurrent包下提供了一些方法来管理线程:
具体看代码里面有注释,一目了然:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class DemoLiftOff implements Runnable {
protected int countDown=10;
private static int taskCount=0;
private final int id=taskCount++;
public DemoLiftOff(){}
public DemoLiftOff(int countDown){
this.countDown=countDown;
}
public String status(){
return "#"+id+"("+(countDown>0?countDown:"Liftoff!")+")";
}
@Override
public void run() {
while(countDown-->0){
System.out.println(status());
Thread.yield();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
//普通的通过Thread启动线程
// for(int i=0;i<5;i++){
// new Thread(new DemoLiftOff()).start();
// System.out.println("waitting for thread over~!!");
// }
//用线程管理池 ExecutorDervice Executors newCachedThreadPool
//创建的线程个数与所需的相同,回收旧线程的时候停止创建新线程(首选)
// ExecutorService exec=Executors.newCachedThreadPool();
// for(int i=0;i<5;i++){
// exec.execute(new DemoLiftOff());
// }
// exec.shutdown();
//newFixedThreadPool
//创建的线程个数可控,优先选择代价高昂的线程,执行完毕在执行别的
// ExecutorService exec=Executors.newFixedThreadPool(3);
// for(int i=0;i<5;i++){
// exec.execute(new DemoLiftOff());
// }
// exec.shutdown();
//SingleThreadExecutor
//创建无论多少个线程会根据创建的次序排序执行完一个执行下一个
ExecutorService exec=Executors.newSingleThreadExecutor();
for(int i=0;i<5;i++){
exec.execute(new DemoLiftOff());
}
exec.shutdown();
}
}