多并发中,很多情况下都用得到这样一种结构,而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; } } }