多线程并发中run方法的wait结构

多并发中,很多情况下都用得到这样一种结构,而wait左右的代码该怎么设计合理,下面举一个例子,时模仿线程池的一个例子,中心就是线程池中每个线程的run方法

synchronized{

while(){

      Obejct.wait();

}

}

下面一段代码:

@Override
public void run() {
    //当线程池没有销毁时
    while (this.taskState != TaskState.DEAD) {
        //为了将从任务队列中取出的任务拿到synchronized外面而生命的Runable
        Runnable runnable;
        //加锁,进入单例
        synchronized (TASK_QUEUE) {
            while (TASK_QUEUE.isEmpty()) {
                //如果任务队列为空,则wait等待notify
                try {
                    //进入等待状态
                    taskState = TaskState.BLOCKED;
                    TASK_QUEUE.wait();
                } catch (InterruptedException e) {
                    e.printStack();
                }
            }
            //被唤醒后是要有顺序的,一定要先取出任务队列中的一个,因为任务和你的线程要对应起来,不能乱取
            //若是在synchronized外面,可能会发生多个线程同时取出任务的情况,就会造成比如空指针的异常等
            runnable = TASK_QUEUE.removeFirst();

        }

        if (runnable != null) {
            taskState = TaskState.RUNNING;
            System.out.println(Thread.currentThread().getName() +
                    " is working");
            runnable.run();
            taskState = TaskState.FREE;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值