java线程中notify_【Java】线程中的wait和notify

线程中的同步问题通常使用的是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 

synchronized (this) {

for (; 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 

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();

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值