- 浏览: 276726 次
- 性别:
- 来自: 长沙
文章分类
最新评论
-
CodeLove:
如果包含<,(,)...等特殊字符呢
Python变量名检测 -
zlxzlxzlxzlxzlx:
这不能算是任意进制之间的转换,只能算是 2、8、10、16 几 ...
java实现的任意进制转换 -
mychaoyue2011:
在本地执行了几遍,结果都是:s2开始休眠s1开始休眠s2休眠结 ...
Java线程学习笔记(四)线程join -
chxiaowu:
不错!
Java版的树 -
TenAclock:
这个例子 做不到“学生都交完” 考试结束,只能做到等到考试时间 ...
Java线程学习笔记(十一) DelayQueue的应用
wait()与notifyAll()
调用sleep()的时候锁并没有被释放,调用yeild()也一样。当一个任务在方法里面遇到了对wait()的调用的时候,线程的执行被挂起,对象的锁被释放。因为wait()将释放锁,这就意味着另一个任务可以获得这个锁,因此在该对象中的其他synchronized方法可以再wait()期间被调用。
wait() notify() notifyAll() 只能在同步控制方法或同步控制块里调用,否则运行时会出错,就是所,wait(),notify()和notifyAll()的任务在调用这些方法前必须拥有对象的锁。
下面为测试代码:
package com.woxiaoe.study.thread; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; class WaiteClient implements Runnable{ @Override public void run() { try { System.out.println("进入WaitClient"); synchronized (this) { wait(); } System.out.println("hello world!"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } class NotifyClient implements Runnable{ private WaiteClient wc; public NotifyClient(WaiteClient wc) { this.wc = wc; } @Override public void run() { try { TimeUnit.SECONDS.sleep(3); synchronized (wc) { wc.notifyAll(); } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public class WaitNotifyTest { public static void main(String[] args) throws InterruptedException { ExecutorService exec = Executors.newCachedThreadPool(); WaiteClient wc = new WaiteClient(); NotifyClient nc = new NotifyClient(wc); exec.execute(wc); exec.execute(nc); /* WaiteClient wc = new WaiteClient(); NotifyClient nc = new NotifyClient(wc); Thread t1 = new Thread(new WaiteClient()); Thread t2 = new Thread(new NotifyClient(wc)); t1.start(); t2.start();*/ exec.shutdown(); TimeUnit.SECONDS.sleep(5); } }
Output:
进入WaitClient
hello world!
但如果改为如下者会报错
package com.woxiaoe.study.thread; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; class WaiteClient implements Runnable{ @Override public void run() { try { System.out.println("进入WaitClient"); //synchronized (this) { wait(); //} System.out.println("hello world!"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } class NotifyClient implements Runnable{ private WaiteClient wc; public NotifyClient(WaiteClient wc) { this.wc = wc; } @Override public void run() { try { TimeUnit.SECONDS.sleep(3); // synchronized (wc) { wc.notifyAll(); //} } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public class WaitNotifyTest { public static void main(String[] args) throws InterruptedException { ExecutorService exec = Executors.newCachedThreadPool(); WaiteClient wc = new WaiteClient(); NotifyClient nc = new NotifyClient(wc); exec.execute(wc); exec.execute(nc); /* WaiteClient wc = new WaiteClient(); NotifyClient nc = new NotifyClient(wc); Thread t1 = new Thread(new WaiteClient()); Thread t2 = new Thread(new NotifyClient(wc)); t1.start(); t2.start();*/ exec.shutdown(); TimeUnit.SECONDS.sleep(5); } }
下面一个是模拟客户端与服务端通信的一个代码,主要为了实验线程间的协作,只有当客户端给服务端发请求后,服务端才向客户端响应。
package com.woxiaoe.study.thread; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; /** * 模拟服务器的基本工作原理,测试wait 与 notifyAll * @author 小e * * 2010-4-26 下午09:51:15 */ class Browser{ boolean requestFlag ; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); /** * 得带浏览器给服务器发请求 * @return * @throws InterruptedException */ public synchronized void waitForRequest() throws InterruptedException{ while(!requestFlag){ wait(); } } /** * 等待服务器响应 * @throws InterruptedException */ public synchronized void waitForResponse() throws InterruptedException{ while(requestFlag){ wait(); } } public synchronized void request(){ System.out.println(getTime() + " 客户端发送请求……"); requestFlag = true; notifyAll(); } public synchronized void response(){ System.out.println(getTime() + " 服务端响应请求……"); requestFlag = false; notifyAll(); } private String getTime(){ return sdf.format(new Date()); } } class Request implements Runnable{ private Browser browser; public Request(Browser browser) { this.browser = browser; } @Override public void run() { try { while (!Thread.interrupted()) { System.out.println("开始向服务端请求数据"); browser.request(); TimeUnit.MILLISECONDS.sleep(1000);// 模拟发送请求的时间消耗 browser.waitForResponse(); } } catch (InterruptedException e) { // TODO Auto-generated catch block System.out.println("处理打断"); } System.out.println("Request模块任务结束"); } } class Response implements Runnable{ private Browser browser; public Response(Browser browser) { this.browser = browser; } @Override public void run() { try { while (!Thread.interrupted()) { browser.waitForRequest();// 等待请求 TimeUnit.MILLISECONDS.sleep(1000);// 模拟处理数据的时间消耗 browser.response(); } } catch (InterruptedException e) { System.out.println("处理打断"); } } } public class Server { public static void main(String[] args) throws InterruptedException { Browser browser = new Browser(); Request request = new Request(browser); Response response = new Response(browser); ExecutorService exec = Executors.newCachedThreadPool(); exec.execute(request); exec.execute(response); TimeUnit.SECONDS.sleep(5);//模拟10秒 exec.shutdownNow(); } }
Output:
开始向服务端请求数据
2010-04-26 23:17:10 客户端发送请求……
2010-04-26 23:17:11 服务端响应请求……
开始向服务端请求数据
2010-04-26 23:17:11 客户端发送请求……
2010-04-26 23:17:12 服务端响应请求……
开始向服务端请求数据
2010-04-26 23:17:12 客户端发送请求……
2010-04-26 23:17:13 服务端响应请求……
开始向服务端请求数据
2010-04-26 23:17:13 客户端发送请求……
2010-04-26 23:17:14 服务端响应请求……
开始向服务端请求数据
2010-04-26 23:17:14 客户端发送请求……
处理打断
处理打断
Request模块任务结束
发表评论
-
Consider the following code: What will be printed?
2010-09-24 20:30 941Consider the following code: Wh ... -
Java 基础复习笔记一
2010-06-04 02:03 1112这两天复习java的基础知识,把一些自己认为比较有用的点记录下 ... -
Java 转义字符
2010-06-03 21:21 977\n 回车(\u000a) \t 水平制表符(\u0009) ... -
生产消费者的模拟
2010-05-27 23:16 1632采用Java 多线程技术,设计实现一个符合生产者和消费者问题的 ... -
Java 控制台下显示文件结构
2010-05-27 00:10 3237题目: 编写一个Java ... -
Java得到类目录
2010-05-26 23:22 1159String path = MainTest.class.ge ... -
Java文件压缩
2010-05-23 21:54 1201package com.woxiaoe.study.io ... -
UDP传输图片的尝试
2010-05-22 18:05 9793UDP是不可靠的,发送的数据不一定会到达,且顺序不一定 ... -
【转载】Java String.Format() 方法及参数说明
2010-05-15 22:18 1303JDK1.5中,String类新增了一个很有用的静态方法S ... -
【转载】String.format函数使用方法介绍
2010-05-15 22:17 1169http://edu.codepub.com/2009/111 ... -
Java线程学习笔记(十一) DelayQueue的应用
2010-05-01 00:34 15587DelayQueue 是一个无界的BlockingQueue ... -
Java线程学习笔记(十)CountDownLatch 和CyclicBarrier
2010-04-30 21:04 2789CountDownLatch : 一个同步辅助类,在完成一组 ... -
Java线程学习笔记(九)生产者消费者问题
2010-04-29 22:27 1694用多线程来模拟生产者消费者问题。用到BlockingQueue ... -
Java线程学习笔记(七)java中递增不是原子性
2010-04-24 23:00 2895以下为测试代码,通过一个自增函数得到最新的值,玩Set你存,看 ... -
Java线程学习笔记(六)在其他对象上同步
2010-04-24 22:47 1337package com.woxiaoe.study.threa ... -
Java线程学习笔记(五)资源共享问题
2010-04-24 21:04 1250IncreaseClient 中持有一个base,每次调用起i ... -
Java线程学习笔记(四)线程join
2010-04-24 20:06 1264《Java编程思想》的一个例子,如果某个线程在另一个线程t上调 ... -
基于java的图(四) 强连通组件
2010-04-22 21:06 1525有向图中, u可达v不一定意味着v可达u. 相互可达则属于同一 ... -
基于java的图(三) 图的拓扑排序
2010-04-21 16:14 1854相关: 基于java的图的实现 基于java ... -
基于java的图的实现(二) 图的两种遍历
2010-04-20 21:51 2084图的实现见http://www.iteye.com/topic ...
相关推荐
java线程学习笔记
Java线程:概念与原理 2 一、操作系统中线程和进程的概念 2 二、Java中的线程 3 三、Java中关于线程的名词解释 3 四、线程的状态转换和生命周期 4 Java线程:创建与启动 7 ...Java线程:线程之间的数据传递 58
多线程学习笔记,通过平时的学习所做的一些笔记,希望对广大同仁有所帮助
java学习笔记2(多线程)java学习笔记2(多线程)
NULL 博文链接:https://baobeituping.iteye.com/blog/1190260
java线程 线程 教程 java线程教程 java线程学习资料 本教程有什么内容? 本教程研究了线程的基础知识— 线程是什么、线程为什么有用以及怎么开始编写使用线程的简单 程序。 我们还将研究更复杂的、使用线程的应用...
Java的线程工具易于使用,并且像Java中的其他东西一样可以在不同的平台之间移植。这是一件好事,因为如果没有线程,那么除了最简单的applet之外,几乎不可能编写出任何程序。如果你想使用Java,就必须学习线程。 ...
花费了一上午的时候 写了一些demo。认识到四种线程池的区别。上传到csdn 供以后学习
Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) Java...
多线程学习笔记,好资源。包括线程基础等知识多线程学习笔记,好资源。包括线程基础等知识
Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解
Java 线程系列博文总结word化,编目如下,欢迎互相学习交流: Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:...
Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程
这篇文档和对应的源代码 博文链接:https://interper56-sohu-com.iteye.com/blog/172303
Java并发编程学习笔记,研究JAVA并发多线程编程的一本教程,使用并发技术可以开发出并行算法,充分利用多处理器的计算能力,避免硬件资源浪费。目前,在JAVA并发编程方面的论述系统且内容详实的技术资料不太多,Java...
基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码....
Java线程Java线程Java线程Java线程Java线程Java线程