首页 > 编程语言 > 详细

线程间的通信

时间:2016-04-07 02:07:40      阅读:164      评论:0      收藏:0      [点我收藏+]

一:线程间的相互作用

? 多线程之间的通信,可以通过wait和notify方法实现,因为wait和notify都是object类中的方法,因此所有的类都有wait和notify方法。

? 需要注意的是wait,notify方法都必须在同步方法或者同步代码块中执行,因为在调用wait和nofity方法前,必须获得该对象的对象级别锁,当调用wait()方法后,当前线程释放锁,但是调用notify()方法,锁并不会马上释放。

?1.1 wait()方法

? wait()方法使得当前线程必须要等待,等到另外一个线程调用notify()或者notifyAll()方法,但是带参数的wait(long)方法在等待了一定时间后,如果还没有收到唤醒的通知,那么其会自动唤醒。

?1.2 notify()方法

??notify()方法会唤醒一个等待当前对象的锁的线程,notifyAll()方法可以使所有在等待队列中等待的线程进入可运行状态,需要注意的是,并不一定是优先级最高的线程最先执行。

二:程序实例

?多生产着,多消费者的等待通知,list的大小永远不会大于1

 public class MyWaitNotifyAll {
	private List<String> list = new ArrayList<String>();
	synchronized public void push() {
		while (list.size() == 1) {
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		list.add("product one");
		this.notifyAll();
		System.out.println("生产了:" + list.size() + "个面包");
	}
	synchronized public void pop() {
		while (list.size() == 0) {
			try {
				System.out.println("没有面包可消费了:" + Thread.currentThread().getName() + "线程呈wait状态");
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		list.remove(0);
		this.notifyAll();
		//notify不是立即释放线程,得等该方法执行完后才释放锁
		System.out.println("消费完还剩:" + list.size() + "个面包");
	}
}
?
 public class ThreadA extends Thread {
   private MyWaitNotifyAll myWaitNotifyAll;
   public ThreadA(MyWaitNotifyAll myWaitNotifyAll) {
       this.myWaitNotifyAll = myWaitNotifyAll;
   }
   @Override
   public void run() {
    while(true){
      myWaitNotifyAll.push();
    }
  }
}
?
 public class ThreadB extends Thread {
    private MyWaitNotifyAll myWaitNotifyAll;
    Public ThreadB(MyWaitNotifyAll myWaitNotifyAll) {
      this.myWaitNotifyAll = myWaitNotifyAll;
    }
   @Override
   public void run() {
    while(true){
     myWaitNotifyAll.pop();
    }
  }
}
 public class TestMyObject {
    public static void main(String[] args) {
      MyWaitNotifyAll myStack = new MyWaitNotifyAll();
      ThreadA threadA = new ThreadA(myStack);
      ThreadA threadA2 = new ThreadA(myStack);
      ThreadA threadA3 = new ThreadA(myStack);
      ThreadB threadB = new ThreadB(myStack);
      ThreadB threadB2 = new ThreadB(myStack);
      ThreadB threadB3 = new ThreadB(myStack);
      threadA.start();
      threadA2.start();
      threadA3.start();
      threadB.start();
      threadB2.start();
      threadB3.start();
   }
}

?运行结果如下:

没有面包可消费了:Thread-3线程呈wait状态
生产了:1个面包
消费完还剩:0个面包
没有面包可消费了:Thread-4线程呈wait状态
生产了:1个面包
消费完还剩:0个面包
没有面包可消费了:Thread-3线程呈wait状态
生产了:1个面包
消费完还剩:0个面包
没有面包可消费了:Thread-5线程呈wait状态
生产了:1个面包
消费完还剩:0个面包
没有面包可消费了:Thread-3线程呈wait状态
生产了:1个面包
消费完还剩:0个面包
.......................

线程间的通信

原文:http://090508tanjie.iteye.com/blog/2288856

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!