java线程的wait方法和notify方法的运用

一.JavaThread类的几个函数的说明:

1.  setPriority( ): 设置线程的优先权;

2 . yield( ): 暂停线程的执行,给其它具有相同优先权的线程执行的机会,若此时没有其它线程执行,则此线程继续执行。这个函数并不会释放锁住的对象。

3.  join( ): 等待加入的线程执行完毕才会执行下一个线程。加入的线程通过interrupt( )来唤醒。

4.  wait( ): 类似sleep( ), 不同的是,wait( )会先释放锁住的对象,然后再执行等待的动作。注意,这个函数属于Object类。另外,由于wait( )所等待的对象必须先锁住,因此,它只能用在同步化程序段或者同步化方法内,否则,会抛出异常IllegalMonitorStateException.

二.  例子:

下面,仅对于wait( ) 和notify( )函数进行测试。

这个例子向读者展示了生产者--消费者关系。

代码:

importJava.util.Vector;

public class ThreadWaitNotifyTest {

public static void main(String args[]) {

Vector obj = new Vector();

Thread consumer = new Thread(new Consumer(obj));

Thread producter = new Thread(new Producter(obj));

consumer.start();

producter.start();

}

}

/*消费者 */

class Consumer implements Runnable {

private Vector obj;

public Consumer(Vector v) {

this.obj = v;

}

public void run() {

synchronized(obj) {

while (true) {

try {

if (obj.size() ==0){

obj.wait();//本线程(消费者)放弃对象锁并等待

}

System.out.println("Consumer:goods have been taken");

System.out.println("obj size: " + obj.size());

obj.clear();

obj.notify();//本线程重新就绪

}

catch(Exception e) {

e.printStackTrace();

}

}

}

}

}

/*  生产者 */

class Producter implements Runnable {

private Vector obj;

public Producter(Vector v) {

this.obj = v;

}

public void run() {

synchronized(obj) {

while (true) {

try {

if (obj.size() !=0){

obj.wait();//本线程(生产者)放弃对象锁并等待

}

obj.add(new String("apples"));//生产一个苹果

obj.notify();//本线程重新就绪

System.out.println("Producter:obj are ready");

Thread.sleep(500);

}

catch(Exception e) {

e.printStackTrace();

}

}

}

}

}

你可能感兴趣的:(java线程的wait方法和notify方法的运用)