Guarded Suspention 要等到我准备好
2024-09-06 05:12:55
线程在运行过程中需要停下来等待,然后再继续执行。
范例程序,一个线程(ClientThread)对另外一个线程(ServerThread)传递请求,实现一个模拟消息通道的功能。
public class GuardedSuspensionTest {
public static void main(String[] args) {
RequestQueue queue = new RequestQueue();
ClientThread ct = new ClientThread(queue, "Alice's Client");
ServerThread st = new ServerThread(queue, "Bobby's Server"); ct.start();
st.start();
}
} class ServerThread extends Thread{
private RequestQueue requestQueue; public ServerThread(RequestQueue requestQueue, String name){
super(name); this.requestQueue=requestQueue;
} @Override
public void run() {
for(int i=0;i <10;i++){
Request request=requestQueue.getRequest();
System.out.println(Thread.currentThread().getName() + " handles " + request);
Thread.yield();
}
}
} class ClientThread extends Thread{
private RequestQueue requestQueue; public ClientThread(RequestQueue requestQueue, String name){
super(name); this.requestQueue=requestQueue;
} @Override
public void run() {
for(int i=0; i<10;i++){
Request request = new Request("No." + i);
System.out.println(Thread.currentThread().getName() + " requests " + request);
requestQueue.putRequest(request); Thread.yield();
}
}
} class RequestQueue{ private final LinkedList<Request> queue = new LinkedList<Request>(); public synchronized Request getRequest(){
while(queue.size()<=0){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} return queue.removeFirst();
} public synchronized void putRequest(Request request){
queue.addLast(request);
notifyAll();
}
} class Request{
private final String name;
public Request(String name){
this.name=name;
}
public String getName(){
return name;
} @Override
public String toString() {
return "[Request name:" + name + "]";
}
}
最新文章
- MyBatis-NET
- emberjs学习一(环境和第一个例子)
- 【JAVA小结】字符串比较是否相等
- Waiting Processed Cancelable ShowDialog (Release 2)
- 查询,创建,扩充表空间&;&;impdp--------表空间大全
- ftk学习记录(一个进度条文章)
- iOS8开发~Swift(一)入门
- 疯狂java讲义--笔记
- java 读取excel(Map结构)xls
- [综述]Deep Compression/Acceleration深度压缩/加速/量化
- IntelliJ IDEA 常用插件
- 使用CROS解决跨域问题
- asp.net mvc模板布局
- jlet
- Android自定义一款带进度条的精美按键
- (精)AVL树旋转共8种情况(涵盖所有考研的范围)
- 【个人经历】记自己的第一次GitHub开源代码共享经历
- 【bzoj3122】 Sdoi2013—随机数生成器
- c++中指针常量,常指针,指向常量的常指针区分
- IntelliJ IDEA 学习(三):IntelliJ IDEA 快捷键、配置优化