线程池的运用

当有很多线程的时候就可以用到线程池了

 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用来工作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值