代码
import com.roocon.thread.t5.Singleton2;
//一个线程执行完后,更改状态,再执行下一个
public class Demo2 {
private volatile int signal;
public void set (int value) {
this.signal = value;
}
public int get () {
return signal;
}
public static void main(String[] args) {
Demo2 d = new Demo2();
new Thread(new Runnable() {
@Override
public void run() {
synchronized (d) {
System.out.println("修改状态的线程执行...");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
d.set(1);
System.out.println("状态值修改成功。。。");
d.notify();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
synchronized (d) {
// 等待signal为1开始执行,否则不能执行
while(d.get() != 1) {
try {
d.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 当信号为1 的时候,执行代码
System.out.println("模拟代码的执行...");
}
}
}).start();
}
}
示例
public class Target1 implements Runnable {
private Demo3 demo;
public Target1(Demo3 demo) {
this.demo = demo;
}
@Override
public void run() {
demo.set();
}
}
public class Target2 implements Runnable {
private Demo3 demo;
public Target2(Demo3 demo) {
this.demo = demo;
}
@Override
public void run() {
demo.get();
}
}
import java.util.concurrent.TimeUnit;
/*
* 1.wait,notify必须要在同步代码块执行,synchronized
* 2.加对象d.wait() d.notify() 见demo类
* 3.调用wait会使线程失去锁(synchronized)
* 4.notify执行后需要等锁释放才会唤醒别的线程
*/
public class Demo3 {
private volatile int signal;
public synchronized void set () {
signal = 1;
notifyAll(); // notify方法会随机叫醒一个处于wait状态的线程
// notifyAll叫醒所有的处于wait线程,争夺到时间片的线程只有一个
System.out.println("叫醒线程叫醒之后休眠开始...");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public synchronized int get () {
System.out.println(Thread.currentThread().getName() + " 方法执行了...");
if(signal != 1) {
try {
wait();
System.out.println("叫醒之后");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + " 方法执行完毕...");
return signal;
}
public static void main(String[] args) {
Demo3 d = new Demo3();
Target1 t1 = new Target1(d);
Target2 t2 = new Target2(d);
new Thread(t2).start();
new Thread(t2).start();
new Thread(t2).start();
new Thread(t2).start();
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(t1).start();
}
}
网友评论