1700450639
1700450640
从任务队列中取出任务来执行。
1700450641
1700450642
其中此处的关键是工作线程的创建,它也是通过new Thread方式创建的一个线程,只是它创建的并不是我们的任务线程(虽然我们的任务实现了Runnable接口,但它只是起一个标志性的作用),而是经过包装的Worker线程,代码如下:
1700450643
1700450644
private final class Worker implements Runnable{
1700450645
1700450646
//运行一次任务
1700450647
1700450648
private void runTask(Runnable task){
1700450649
1700450650
//这里的task才是我们自定义实现Runnable接口的任务
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)
[
上一页 ]
[ :1.700450639e+09 ]
[
下一页 ]