线程wait和notify的针对每个线程,实现·随时暂停和唤醒

多线程的利用在进行进程调度中具有重要的意义,是java的一个比较有意义的功能,它实现了时间和空间上的合理分配。以下例子实现了两个线程的随时单独暂停和继续,多个线程只要往上加就可以了,代码如下:

public class TestThread implements Runnable {
public int state1 = 0;
public int state = 0;
public String name;

public TestThread(String name) {
// new Thread(this).start();
this.name = name;
}

@Override
public void run() {
// state为2时,进入等待,等到state1=1时的唤醒后继续
synchronized (this) {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
if (2 == state) {
System.out.println(this.state);
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(this.name + " Run--------------->");
}
}

}

public void wakeUpThisThread() {
synchronized (this) {
if (1 == this.state1) {
this.notify();
}
}
}

public static void main(String[] args) {
//启动两个线程做对比
TestThread tt1 = new TestThread("Thread1");
Thread t1 = new Thread(tt1);
t1.start();

// 第二段
TestThread tt2 = new TestThread("Thread2");
Thread t2 = new Thread(tt2);
t2.start();

//5秒钟后看线程暂停
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
tt1.state = 2;
tt2.state = 2;

//8秒后只恢复线程1,23秒后恢复线程2,可见notify并不是针对所有的,是可以单独针对某线程的
try {
Thread.sleep(8000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("激活");
tt1.state1 = 1;
tt1.state = 0;
tt1.wakeUpThisThread();

tt2.state1 = 1;
tt2.state = 0;
// tt2.wakeUpThisThread();
int count=0;
while (true) {
count++;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(15==count){
tt2.wakeUpThisThread();
}
}

}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值