私は10人の労働者のリストと以下の2つの方法のコードを持っています:
public void demoDeques() {
int maxSizeOfJobDeque = 3;
Producer producer = new ProducerImpl( maxSizeOfJobDeque );
Logger.debug( "WorkFlowEngineImpl : " +
"Creating Workers and adding them to allocator" );
List<Worker> workerList = buildWorkerList( producer );
Logger.debug( "WorkFlowEngineImpl : " +
"Assigning some jobs to the workers. " +
"The workers have not been started yet");
for ( int i=1; i<4; i++ ) {
producer.assign( new JobImpl( "job " + i, i ) );
try {
Thread.sleep( 4000 );
} catch( InterruptedException e ) {
e.printStackTrace();
}
}
Logger.debug( "WorkFlowEngineImpl : " + "Starting the workers" );
startWorkersAndWait5Seconds( workerList );
Logger.debug( "WorkFlowEngineImpl : " +
"Assigning some more jobs to the " +
"started workers" );
for ( int i=4; i<7; i++ ) {
producer.assign( new JobImpl( "Job " + i, i ) );
try {
Thread.sleep( 4000 );
} catch( InterruptedException e ) {
e.printStackTrace();
}
}
Logger.debug( "WorkFlowEngineImpl : " + "Assigning More Jobs" );
for ( int i=7; i<11; i++ ) {
producer.assign( new JobImpl( "job" + i, i ) );
try {
Thread.sleep( 4000 );
} catch( InterruptedException e ) {
e.printStackTrace();
}
}
}
プロデューサー:
public synchronized void assign( Job job ) {
Set<Worker> workerSet = jobMap.keySet();
LinkedBlockingDeque<Job> jobQueue;
StringBuffer sb;
for ( Worker worker : workerSet ) {
jobQueue = jobMap.get( worker );
sb = new StringBuffer();
sb.append( "Assigning job " );
sb.append( job.getJobNumber() );
sb.append( " to " );
sb.append( worker );
sb.append( "'s jobs Deque" );
Logger.debug( "Producer : " + sb.toString() );
if ( ! jobQueue.offerFirst( job ) ) {
jobQueue.pollLast();
jobQueue.offerFirst( job );
}
}
}
2 つの方法を変更して、アロケーターに 100 のジョブのリストを持たせ、100 に達するまで一度に最大 3 つのジョブが 10 人のワーカーに割り当てられるように割り当てます。ジョブ 1,2,3 ワーカー 2 は 4,5,6 を取得するため、ワーカー 10 に到達するとワーカー 1 に戻り、100 番目のジョブに到達するまで 3 つのジョブを割り当てて停止し、すべてのジョブが割り当てられたことを警告します。私が立ち往生しているのを助けてください....