打字猴:1.700450651e+09
1700450651
1700450652 task.run();
1700450653
1700450654 }
1700450655
1700450656 //工作线程也是线程,必须实现的run方法
1700450657
1700450658 public void run(){
1700450659
1700450660 while(task!=null||(task=getTask())!=null){
1700450661
1700450662 runTask(task);
1700450663
1700450664 task=null;
1700450665
1700450666 }
1700450667
1700450668 }
1700450669
1700450670 //从任务队列中获得任务
1700450671
1700450672 Runnable getTask(){
1700450673
1700450674 for(;){
1700450675
1700450676 return workQueue.take();
1700450677
1700450678 }
1700450679
1700450680 }
1700450681
1700450682 此处为示意代码,删除了大量的判断条件和锁资源。execute方法是通过Worker类启动的一个工作线程,执行的是我们的第一个任务,然后该线程通过getTask方法从任务队列中获取任务,之后再继续执行,但问题是任务队列是一个BlockingQueue,是阻塞式的,也就是说如果该队列元素为0,则保持等待状态,直到有任务进入为止,我们来看LinkedBlockingQueue的take方法,代码如下:
1700450683
1700450684 public E take()throws InterruptedException{
1700450685
1700450686 //如果队列中元素数量为0,则等待
1700450687
1700450688 while(count.get()==0)
1700450689
1700450690 notEmpty.await();
1700450691
1700450692 //等待状态结束,弹出头元素
1700450693
1700450694 x=extract();
1700450695
1700450696 //如果队列数量还多于1个,唤醒其他线程
1700450697
1700450698 if(c>1)
1700450699
1700450700 }
[ 上一页 ]  [ :1.700450651e+09 ]  [ 下一页 ]