보호 일시 중단 모드(Guarded Suspension)
17865 단어 다중 스레드
public class Requets
{
final private String value;
public Requets(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
대기열 만들기
public class RequestQueue {
private final LinkedList<Requets> queue = new LinkedList<>();
public Requets getRequest(){
synchronized (queue){
while(queue.size() <= 0){
try {
// , ,wait
queue.wait();
} catch (InterruptedException e) {
return null;
}
}
return queue.removeFirst();
}
}
public void putRequest(Requets requets){
synchronized (queue){
queue.addLast(requets);
queue.notifyAll();
}
}
}
//
public class ClientThread extends Thread{
private final RequestQueue queue;
private final Random random;
private final String sendValue;
public ClientThread(RequestQueue queue , String sendValue) {
this.queue = queue;
this.sendValue = sendValue;
random = new Random(System.currentTimeMillis());
}
@Override
public void run() {
for (int i = 0; i < 20 ; i++){
System.out.println("Client -> request " + sendValue);
queue.putRequest(new Requets(sendValue));
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
서비스 측 수락
public class ServerThread extends Thread {
private final RequestQueue queue;
private final Random random;
private volatile boolean flag = true;
ServerThread(RequestQueue queue){
this.queue = queue;
random = new Random((System.currentTimeMillis()));
}
@Override
public void run() {
// ,
while (flag){
Requets request = queue.getRequest();
if(null == request){
System.out.println("received the empty request");
continue;
}
System.out.println("Server -> " + request.getValue());
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
return;
}
}
}
// ,
public void close(){
this.flag = false;
this.interrupt();
}
}
테스트 클래스
public static void main(String[] args) throws InterruptedException {
final RequestQueue requestQueue = new RequestQueue();
new ClientThread(requestQueue,"ALEX").start();
ServerThread serverThread = new ServerThread(requestQueue);
serverThread.start();
//
Thread.sleep(30000);
serverThread.close();
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java 다중 스레드를 순차적으로 실행하는 몇 가지 방법 요약Java 다중 스레드를 순차적으로 실행하는 몇 가지 방법 요약 동료는 무심결에 이 문제를 제기하고 두 가지 방법을 직접 실천했다.물론 더 좋은 방법이 있을 거야. 방법 1 이런 방법은 비교적 흔히 볼 수 있는 해결 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.