当前位置:首页 > fourinone源代码分析
//Exception in thread \//at WorkerDemo.main(WorkerDemo.java:21)
//该错误为数组下界越标,因main()入口函数中新建WorkerDemo对象时使用arg[0]参数。 //如果运行WorkerDemo命令时没输入任何参数则提未错误 import com.fourinone.MigrantWorker; import com.fourinone.WareHouse;
public class WorkerDemo extends MigrantWorker { private String workname; public WorkerDemo(String workname) { this.workname = workname; } public WareHouse doTask(WareHouse inhouse) { String v = inhouse.getString(\ System.out.println(workname+\ return new WareHouse(\ } public static void main(String[] args) { WorkerDemo wd = new WorkerDemo(args[0]); wd.waitWorking(\ } }
3、最后运行包工头(CtorDemo)程序。
包工头向职介所获取工人信息,并把由第一个包工头把任务链式地(串行)分配给工人同时处理(并行)。
源文件为: CtorDemo.java
import com.fourinone.Contractor; import com.fourinone.WareHouse; import com.fourinone.WorkerLocal; import java.util.ArrayList;
public class CtorDemo extends Contractor { private String ctorname;
}
CtorDemo(String ctorname) { this.ctorname = ctorname; }
public WareHouse giveTask(WareHouse inhouse) { WorkerLocal[] wks = getWaitingWorkers(\ System.out.println(\ String outStr = inhouse.getString(\ WareHouse[] hmarr = new WareHouse[wks.length];
int data=0; for(int j=0;j<20;) { for(int i=0;i public static void main(String[] args) { Contractor a = new CtorDemo(\ a.toNext(new CtorDemo(\ WareHouse house = new WareHouse(\ System.out.println(a.giveTask(house,true)); } 4、前两例总结: 有四个对象需明确:ParkServer(职介所)、Worker(工人)、Contractor(工头)、WareHouse(手工仓库,或任务)。 ①ParkServer优先运行保证工人能登记信息,工头能获取工人信息; ②工人获取leader server(职介所),并登记自己的名称,所属类型,端口等信息,登记后等待被分配任务waitingWorking()。在执行任务时被工头调用doTask()方法; ③工头从职介所获取工人信息getWaitingWorkers(),并以giveTask()方法分配任务给各工人; ④WareHouse作为任务对象,表示要处理的信息,不管是doTask()还是giveTask()都以WareHouse对象为参数传递,最后也返回处理后的WareHouse任务对象。 ⑤因此,在整个分布设计中,基本遵循开办职介所、工人主动登记信息、工头把任务Warehouse分配给工人处理的过程。 五、工头向工人说hello,工人互相说hello,并批量处理工头任务 1、首先运行职介所(ParkServerDemo)程序。 必须首先运行,用于给工人登记及包工头获取工人信息。 源文件为:ParkServerDemo.java(与上面例子同,此处不再重复) 2、然后运行工人(HelloWorker)程序。 工人向职介所登记自己,并等待任务。此处的任务与前面两例不同,工人除了完成工头的任务(接收工头hello信息)并返回自己的名字(hello,I am XXX),还要用getWorkerElse()方法获取其它工人信息,并向其它工人说自己的名字(hello,I am XXX)。工人与工人之间的调用使用receive()方法进行,不用doTask()方法,doTask()方法是用于工头调用工人时。 源文件为:HelloWorker.java import com.fourinone.MigrantWorker; import com.fourinone.WareHouse; import com.fourinone.Workman; public class HelloWorker extends MigrantWorker { private String name; public HelloWorker(String name){ this.name = name; } public WareHouse doTask(WareHouse inhouse) { System.out.println(inhouse.getString(\ WareHouse wh = new WareHouse(\ Workman[] wms = getWorkerElse(\ for(Workman wm:wms) wm.receive(wh); return wh; } public boolean receive(WareHouse inhouse) { System.out.println(inhouse.getString(\ return true; } public static void main(String[] args) { HelloWorker mw = new HelloWorker(args[0]); mw.waitWorking(args[1],Integer.parseInt(args[2]),\ } } 3、最后运行包工头(HelloCtor)程序。 包工头向职介所获取工人信息,并向工人说hello,它调用批量处理方法doTaskBatch(),要等到该集群中的所有工人最慢的那个完任务后才返回,如果要让快的工人再接受新的任务,请用第“四”轮循的办法。注意,工头最后用HelloCtor.exit();方法退出jvm环境。 源文件为:HelloCtor.java import com.fourinone.Contractor; import com.fourinone.WareHouse; import com.fourinone.WorkerLocal; public class HelloCtor extends Contractor { public WareHouse giveTask(WareHouse inhouse) { WorkerLocal[] wks = getWaitingWorkers(\ System.out.println(\ WareHouse wh = new WareHouse(\ WareHouse[] hmarr = doTaskBatch(wks, wh); for(WareHouse result:hmarr) System.out.println(result); return null; } public static void main(String[] args) { HelloCtor a = new HelloCtor(); a.giveTask(null); a.exit(); } } 可以工头程序改动一下,变为在命令后输入hello信息,改动后如下: import com.fourinone.Contractor;
共分享92篇相关文档