Java 다중 스레드WorkerThread 모드
예제 프로그램
public class Main {
public static void main (String[] args) {
Channel channel = new Channel(5); //
channel.startWorkers();
new ClientThread("Alice", channel).start();
new ClientThread("Bobby", channel).start();
new ClientThread("Chris", channel).start();
}
}
ClientThread 클래스
import java.util.Random;
public class ClientThread extends Thread {
private final Channel channel;
private static final Random random = 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(random.nextInt(1000));
}
} catch (InterruptException e) {}
}
}
Request 클래스
import java.util.Random;
public class Request {
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 execute() {
System.out.println(Thread.currentThread().getName() + " executes " + this );
try {
Thread.sleep(random.nextInt(1000));
} catch (InterruptedException e) {}
}
public String toString() {
return "[ Request from " + name + " No. " + number + " ]";
}
}
Channel 클래스
public class Channel {
private static final int MAX_REQUEST = 100;
private final Request[] requestQueue;
private int tail ; // putRequest
private int head; // takeRequest
private int count ; // Request
private final WorkerThread[] threadPool;
public Channel (int threads) {
this.requestQueue = 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 >= requestQueue.length){
try {
wait();
} catch (InterruptedException e){}
requestQueue[tail] = request;
tail = (tail + 1) % requestQueue.length;
count++;
notifyAll();
}
}
public synchronized Request takeRequest() {
while (count <= 0) {
try {
wait();
} catch (InterruptedException e) {}
Request request = requestQueue[head];
head = (head + 1) % requestQueue.length;
count--;
notifyAll();
return request;
}
}
}
Worker Thread 클래스
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.execute();
}
}
}
Worker Thread 모드의 등장 역할
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.