【Java】线程中的wait和notify
2015-06-10 09:51
447 查看
线程中的同步问题通常使用的是synchronized块,结合wait和notify方法,今天简单做了一个测试。发现当一个线程锁定了某个临界资源后另一个线程会自动等待,以往自己还认为需要自己写代码让其等待呢。。。
共享资源:
共享资源:
package sm.model; import org.apache.log4j.Logger; public class ThreadFuncs { /** * Logger for this class */ private static final Logger logger = Logger.getLogger(ThreadFuncs.class); private int shareNum; public ThreadFuncs(int initShareNum) { this.shareNum = initShareNum; } public void run1() { if (shareNum < 10) { synchronized (this) { for (; shareNum < 30; shareNum++) { logger.info("I go to print " + shareNum); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } if (shareNum == 10) { try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } } public void run2() { /*logger.info("I am in run2 " + shareNum); while (shareNum == 0) { try { logger.info("I am in while " + shareNum); Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }*/ synchronized (this) { for (; shareNum < 20; shareNum++) { logger.info("print " + shareNum); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } this.notify(); } } }线程1:
package sm.examples.threaddemo; import sm.model.ThreadFuncs; public class Thread3_1 extends Thread { private ThreadFuncs funcs; public Thread3_1(ThreadFuncs funcs) { this.funcs = funcs; } @Override public void run() { funcs.run1(); } }线程2:
package sm.examples.threaddemo; import sm.model.ThreadFuncs; public class Thread3_2 extends Thread { private ThreadFuncs funcs; public Thread3_2(ThreadFuncs funcs) { this.funcs = funcs; } @Override public void run() { funcs.run2(); } }测试类:
package sm.test; import org.junit.Test; import sm.examples.threaddemo.Thread3_1; import sm.examples.threaddemo.Thread3_2; import sm.model.ThreadFuncs; public class TestThreadWaitNotifyDemo { @Test public void test() { ThreadFuncs funcs = new ThreadFuncs(0); Thread t1 = new Thread3_1(funcs); Thread t2 = new Thread3_2(funcs); t1.start(); t2.start(); try { Thread.sleep(100000); } catch (InterruptedException e) { e.printStackTrace(); } } }
相关文章推荐
- 用fillzilla 修改Liunx服务器上的配置文件引起的java.lang.NoClassDefFoundError
- Java基础毕向东day03
- SpringMVC中AJAX请求出现406
- ndk-r10 Eclipse配置
- struts2继承json-default与bean中的boolean的小问题
- 如何安装openjdk1.7
- MyEclipse8.6配置Maven
- win7下jdk8环境变量的配置
- java API文档翻译
- 使用Java语言实现,自动生成10个整数(1~100,求出生成数列中的最大值和最小值,不允许使用Arrays类的sort方法
- java - calculator
- R.java was modified manually! Reverting to generated version!项目显示红色感叹号
- EditPlus配置Java语法自动补全功能
- 【struts2】中method={1}详解
- java 中小数点的处理
- myeclipse 安装SVN插件
- Java实现不同excel格式(*.xls、*.xlsx)文件的读取
- Struts 2 学习(一) 环境配置
- Spring 简介
- springMVC 开涛 数据绑定