线程在运行过程中需要停下来等待,然后再继续执行。

范例程序,一个线程(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 + "]";
}
}

  

最新文章

  1. MyBatis-NET
  2. emberjs学习一(环境和第一个例子)
  3. 【JAVA小结】字符串比较是否相等
  4. Waiting Processed Cancelable ShowDialog (Release 2)
  5. 查询,创建,扩充表空间&amp;&amp;impdp--------表空间大全
  6. ftk学习记录(一个进度条文章)
  7. iOS8开发~Swift(一)入门
  8. 疯狂java讲义--笔记
  9. java 读取excel(Map结构)xls
  10. [综述]Deep Compression/Acceleration深度压缩/加速/量化
  11. IntelliJ IDEA 常用插件
  12. 使用CROS解决跨域问题
  13. asp.net mvc模板布局
  14. jlet
  15. Android自定义一款带进度条的精美按键
  16. (精)AVL树旋转共8种情况(涵盖所有考研的范围)
  17. 【个人经历】记自己的第一次GitHub开源代码共享经历
  18. 【bzoj3122】 Sdoi2013—随机数生成器
  19. c++中指针常量,常指针,指向常量的常指针区分
  20. IntelliJ IDEA 学习(三):IntelliJ IDEA 快捷键、配置优化

热门文章

  1. HTTP与HTTPS的区别与联系
  2. 天道神诀---FTP服务
  3. pytest的断言、跳过、运行的按需要处理
  4. AForge.Video.FFMPEG库几个注意事项
  5. python_django_urls基础配置
  6. Python中的网络爬虫怎么用?
  7. Dubbox框架和Zookeeper 依赖的引入
  8. tesserocr与pytesseract模块的使用
  9. 牛客多校第八场 C CDMA 线性代数:沃尔什矩阵
  10. Vue.js - 路由 vue-router 的使用详解2(参数传递)