Channel:接收工作请求并将工作请求交给工人线程的类
public class Channel {
private static final int MAX_REQUEST = 100 ;
private final Request[ ] requestsQueue;
private int tail;
private int head;
private int count;
private final WorkerThread[ ] threadPool;
public Channel ( int threads) {
this . requestsQueue = new Request [ MAX_REQUEST] ;
this . head = 0 ;
this . tail = 0 ;
this . count = 0 ;
threadPool = new WorkerThread [ threads] ;
for ( int i = 0 ; i < threadPool. length; i++ ) {
threadPool[ i] = new WorkerThread ( "worker- " + i, this ) ;
}
}
public void startWorkers ( ) {
for ( int i = 0 ; i < threadPool. length; i++ ) {
threadPool[ i] . start ( ) ;
}
}
public synchronized void putRequest ( Request request) {
while ( count >= requestsQueue. length) {
try {
wait ( ) ;
} catch ( InterruptedException e) {
}
}
requestsQueue[ tail] = request;
tail = ( tail + 1 ) % requestsQueue. length;
count++ ;
notifyAll ( ) ;
}
public synchronized Request takeRequest ( ) {
while ( count <= 0 ) {
try {
wait ( ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
Request request = requestsQueue[ head] ;
head = ( head + 1 ) % requestsQueue. length;
count-- ;
notifyAll ( ) ;
return request;
}
}
ClientThread:表示发出工作请求的线程的类
public class ClientThread extends Thread {
private final Channel channel;
private static final Random radom = new Random ( ) ;
public ClientThread ( String name, Channel channel) {
super ( name) ;
this . channel = channel;
}
public void run ( ) {
try {
for ( int i = 0 ; true ; i++ ) {
Request request = new Request ( getName ( ) , i) ;
channel. putRequest ( request) ;
Thread. sleep ( radom. nextInt ( 1000 ) ) ;
}
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
}
Main:启动类
public class Main {
public static void main ( String[ ] args) {
Channel channel = new Channel ( 5 ) ;
channel. startWorkers ( ) ;
new ClientThread ( "aliex" , channel) . start ( ) ;
new ClientThread ( "bobby" , channel) . start ( ) ;
new ClientThread ( "chrix" , channel) . start ( ) ;
}
}
Request:表示工作请求的类
public class Request extends Thread {
private final String name;
private final int number;
private static final Random random = new Random ( ) ;
public Request ( String name, int number) {
this . name = name;
this . number = number;
}
public void excute ( ) {
System. out. println ( Thread. currentThread ( ) . getName ( ) + " executes " + this ) ;
try {
Thread. sleep ( random. nextInt ( 1000 ) ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
public String toString ( ) {
return " [ Request from" + name + " No. " + number + " ] " ;
}
}
WorkerThread:表示工人线程的类
public class WorkerThread extends Thread {
private final Channel channel;
public WorkerThread ( String name, Channel channel) {
super ( name) ;
this . channel = channel;
}
public void run ( ) {
while ( true ) {
Request request = channel. takeRequest ( ) ;
request. excute ( ) ;
}
}
}