模拟10个线程抓取数据,限制一次性最多有5个线程工作

package com.thread.demo.unit2;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

/**
 * @Author: Peacock__
 * @Date: 2019/5/5 15:27
 */
public class CaptureData {

    /**
     * 模拟10个线程抓取数据,限制一次性最多有5个线程工作
     */

    //保护对象
    private static final LinkedList<Control> CONTROL = new LinkedList<>();
    
    private static final Integer MAX_COUNT = 5;

    public static void main(String[] args) {

        //定义10个线程
        List<Thread> workers = new ArrayList<>();
        Arrays.asList("M1", "M2", "M3", "M4", "M5", "M6", "M7", "M8", "M9", "M10").stream().map(CaptureData::create).forEach(t -> {
            t.start();
            workers.add(t);
        });

        //join主线程,以便查看控制台数据结果
        workers.stream().forEach(t -> {
            try {
                t.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
    }

    private static Thread create(String name){
        return new Thread(name){
            @Override
            public void run() {
                synchronized (CONTROL){
                    System.out.println(Thread.currentThread().getName()+" START");
                    while(CONTROL.size() > MAX_COUNT){
                        try {
                            //若已经在工作的线程数大于MAX_COUNT时,再进来的线程需要等待
                            CONTROL.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    CONTROL.addLast(new Control());
                }

                System.out.println(Thread.currentThread().getName()+" WORKING");
                try {
                    //假装在执行工作,耗时10秒
                    Thread.sleep(10_000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                synchronized (CONTROL){
                    System.out.println(Thread.currentThread().getName()+" END");
                    //一个线程执行完毕后,将其移除,并唤醒等待的线程
                    CONTROL.removeFirst();
                    CONTROL.notifyAll();
                }
            }
        };
    }

    static class Control{

    }
}

控制台输出

M1 START
M1 WORKING
M6 START
M6 WORKING
M2 START
M2 WORKING
M7 START
M7 WORKING
M4 START
M4 WORKING
M3 START
M3 WORKING
M5 START
M10 START
M8 START
M9 START
M6 END
M9 WORKING
M1 END
M5 WORKING
M7 END
M8 WORKING
M3 END
M10 WORKING
M2 END
M4 END
M5 END
M9 END
M8 END
M10 END

Process finished with exit code 0

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值