先介绍几个函数:
setPriority( ): 设置线程的优先权。
yield( ): 暂停线程的执行,给其它具有相同优先权的线程执行的机会,若此时没有其它线程执行,则此线程继续执行。这个函数并不会释放锁住的对象。
join( ): 等待加入的线程执行完毕才会执行下一个线程。加入的线程通过interrupt( )来唤醒。
wait( ): 类似sleep( ), 不同的是,wait( )会先释放锁住的对象,然后再执行等待的动作。注意,这个函数属于Object类。另外,由于wait( )所等待的对象必须先锁住,因此,它只能用在同步化程序段或者同步化方法内,否则,会抛出异常IllegalMonitorStateException
notify():恢复相同对象中第一个调用wait()的线程。
生产消费者模型:二者共享数据value,这里,生产者是Producter, 消费者是Consumer。生产者负责放物品到value中,消费者使用wait( )等待生产者的通知。当得到通知后,消费者取出物品,并且用notify( )通知生产者,可以再放下一批物品。
代码实例:
package cn.edu.pzhu;
class Q {
int value;
boolean tag = false; //标志生产消费的状态
public synchronized int get() {
if (!tag) {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("Got: " + value);
tag = false;
notify();
return value;
}
public synchronized void put(int val) {
if (tag) {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("Put: " + val);
value = val;
tag = true;
notify();
}
}
class Producer implements Runnable {
Q q;
public Producer(Q q) {
this.q = q;
new Thread(this).start();
}
@Override
public void run() {
int i = 1;
while(i < 5) {
q.put(i++);
}
}
}
class Consumer implements Runnable {
Q q;
public Consumer(Q q) {
this.q = q;
new Thread(this).start();
}
@Override
public void run() {
int i = 1;
while(i < 5) {
q.get();
}
}
}
public class PCDemo {
public static void main(String[] args) {
Q q = new Q();
@SuppressWarnings("unused")
Producer producer = new Producer(q);
@SuppressWarnings("unused")
Consumer consumer = new Consumer(q);
}
}
测试结果
Put: 1
Got: 1
Put: 2
Got: 2
Put: 3
Got: 3
Put: 4
Got: 4
如有不当之处欢迎指出!