当有很多线程的时候就可以用到线程池了
ExecutorService executor = Executors.newFixedThreadPool(3);
这是创建3个固定的线程池,如果线程有4个,则另一个只能处于等待状态
public class App {
public static void main(String[] args) {
List<Task> tasks = new ArrayList<>();
tasks.add(new PotatoPeelingTask(3));
tasks.add(new PotatoPeelingTask(6));
tasks.add(new CoffeeMakingTask(2));
tasks.add(new CoffeeMakingTask(6));
tasks.add(new PotatoPeelingTask(4));
tasks.add(new CoffeeMakingTask(2));
tasks.add(new PotatoPeelingTask(4));
tasks.add(new CoffeeMakingTask(9));
tasks.add(new PotatoPeelingTask(3));
tasks.add(new CoffeeMakingTask(2));
tasks.add(new PotatoPeelingTask(4));
tasks.add(new CoffeeMakingTask(2));
tasks.add(new CoffeeMakingTask(7));
tasks.add(new PotatoPeelingTask(4));
tasks.add(new PotatoPeelingTask(5));
ExecutorService executorService= Executors.newFixedThreadPool(3);
for (int i=0;i<tasks.size();i++){
Runnable worker=new Worker(tasks.get(i));
executorService.execute(worker);
}
executorService.shutdown();
}
}
public class CoffeeMakingTask extends Task {
private static final int TIME_PER_CUP=100;
public CoffeeMakingTask(int numCups) {
super(numCups*TIME_PER_CUP);
}
@Override
public String toString() {
return String.format("%s %s", this.getClass().getSimpleName(), super.toString());
}
}
public class PotatoPeelingTask extends Task{
private static final int TIME_PER_POTATO=200;
public PotatoPeelingTask(int numPotatoes){
super(numPotatoes*TIME_PER_POTATO);
}
@Override
public String toString() {
return String.format("%s %s",this.getClass().getSimpleName(),super.toString());
}
}
public abstract class Task {
private static final AtomicInteger ID_GENERATOR=new AtomicInteger();
private final int id;
private final int timeMs;
public Task(final int timeMs){
this.id=ID_GENERATOR.incrementAndGet();
this.timeMs=timeMs;
}
public int getId() {
return id;
}
public int getTimeMs() {
return timeMs;
}
@Override
public String toString() {
return String.format("id=%d timeMs=%d",id,timeMs);
}
}
public class Worker implements Runnable{
private final Task task;
public Worker(final Task task){
this.task=task;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+" processing "+task.toString());
try {
Thread.sleep(task.getTimeMs());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
流程是两个具体的task继承了一个抽象的task,worker用来工作