worker模式的示例代码


这篇文章给大家分享的是有关worker模式的示例代码的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。publicclassMain{publicstaticvoidmain(String[]args){Channelchannel=newChannel(5);//工人线程的數量,即线程池内的线程数目 channel.startWorkers();//启动线程池内的线程 newClientThread(“Alice”,channel).start();//发送请求的线程,相当于向队列加入请求 newClientThread(“Bobby”,channel).start();newClientThread(“Chris”,channel).start();}}发送请求的client代码:publicclassClientThreadextendsThread{privatefinalChannelchannel;//相当于线程池 privatestaticfinalRandomrandom=newRandom();publicClientThread(Stringname,Channelchannel){super(name);this.channel=channel;}publicvoidrun(){try{inti=0;Requestrequest=newRequest(getName(),i);//生成请求 channel.putRequest(request);//向队列中放入请求,也即把请求传给线程池 Thread.sleep(random.nextInt(1000));}catch(InterruptedExceptione){}}}ClientThread建立请求,并把请求传给了channel,下面来看看channel类(相当于线程池类)publicclassChannel{privatestaticfinalintMAX_REQUEST=100;privatefinalRequest[]requestQueue;//存放请求的队列 privateinttail;//下一个putRequ 香港云主机est的地方privateinthead;//下一个takeRequest的地方privateintcount;//Request的数量 privatefinalWorkerThread[]threadPool;publicChannel(intthreads){this.requestQueue=newRequest[MAX_REQUEST];this.head=0;this.tail=0;this.count=0;threadPool=newWorkerThread[threads];for(inti=0;i
threadPool[i]=newWorkerThread(“Worker-“+i,this);//生成线程池中的线程 }}publicvoidstartWorkers(){for(inti=0;i
threadPool[i].start();//启动线程池中的线程 }}publicsynchronizedvoidputRequest(Requestrequest){//向队列中存入请求 while(count>=requestQueue.length){try{wait();}catch(InterruptedExceptione){}}requestQueue[tail]=request;tail=(tail+1)%requestQueue.length;count++;notifyAll();}publicsynchronizedRequesttakeRequest(){//从队列取出请求 while(count
try{wait();}catch(InterruptedExceptione){}}Requestrequest=requestQueue[head];head=(head+1)%requestQueue.length;count–;notifyAll();returnrequest;}}channel类把传给他的请求放入队列中,等待worker去取请求,下面看看worker(即工作线程,线程池中已经初始话好的线程)publicclassWorkerThreadextendsThread{privatefinalChannelchannel;publicWorkerThread(Stringname,Channelchannel){super(name);this.channel=channel;}publicvoidrun(){while(true){Requestrequest=channel.takeRequest();//取出请求 request.execute();//处理请求 }}}在工作线程中会从线程池的队列里取出请求,并对请求进行处理。这里的workerthread相当于背景线程,他一直都在运行,当有请求的时候,他就会进行处理,这里处理请求的线程是已经存在在channel(线程池里的线程),他不会因为请求的增加而增加(这是本例中的情况),不会来一个请求就新建立一个线程,节省了资源。再看看请求的代码:publicclassRequest{privatefinalStringname;//委托者privatefinalintnumber;//请求编号 privatestaticfinalRandomrandom=newRandom();publicRequest(Stringname,intnumber){this.name=name;this.number=number;}publicvoidexecute(){//执行请求 System.out.println(Thread.currentThread().getName()+”executes”+this);try{Thread.sleep(random.nextInt(1000));}catch(InterruptedExceptione){}}publicStringtoString(){return”[Requestfrom”+name+”No.”+number+”]”;}}JAVA SDK所写的ExecutorService,其就相当于channel,即线程池。至于其实现当然要比channel复杂多了,channel只是举个例子。而WorkerThread可不是工作线程,他相当于发送到channel的请求,也就是request,当执行代码:tpes.execute(workers[i]);时,相当于向线程池加入一个请求,而WorkerThread中的run则相当于request中的execute,这也是当执行tpes.execute(workers[i]);时,并不会产生新的线程的原因。ExecutorService中产生的背景线程(相当于本篇的WorkerThread )我们是看不到的。感谢各位的阅读!关于“worker模式的示例代码”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

相关推荐: Spring Boot多环境配置方法是什么

本篇内容介绍了“Spring Boot多环境配置方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.1创建父项目步骤一:创建父项目 cloud_pare…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 09/22 15:43
Next 09/22 15:43

相关推荐