1. 程式人生 > 其它 >執行緒通訊的例題

執行緒通訊的例題

技術標籤:多執行緒

package com.yang.java;
/**
*wait():一旦執行此方法,當前執行緒就會進入阻塞狀態,並釋放同步監視器
notify():一旦執行此方法,就會喚醒被wait()的一個執行緒,如果有多個執行緒被wait,就喚醒優先順序高的
notifyALL():一旦執行此方法就會喚醒被wait的執行緒
**/
import java.util.concurrent.locks.ReentrantLock;

public class ArrayTest {
public static void main(String[] args) {
	Window3  td=
new Window3(); Thread t1 = new Thread(td); Thread t2 = new Thread(td); t1.setName("視窗1"); t2.setName("視窗2"); t1.start(); t2.start(); } } /** sysnchronized都可以解決執行緒安全問題 不同點:sysnchronized機制在執行完相應的同步程式碼以後 自動釋放監視器 lock 需要手動的啟動同步(lock()),同時結束也需要手動實現UnLock() */
class Window3 implements Runnable { private int number=1; private ReentrantLock lock=new ReentrantLock(); @Override public void run() { while (true) { // try { // lock.lock(); // // } finally { // lock.unlock(); // } synchronized(this
) { //喚醒 notify(); if (number <=100) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + ":賣票,票號為:" + number); number++; try { // sleep不會釋放鎖 // 使用呼叫wait方法讓其阻塞,喚醒執行緒 wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }else { break; } } } } /** private synchronized void show(){//同步監視器:this //synchronized (this){ //} }**/ }

wait()和sleep()方法的區別

相同點:一旦執行方法,都可以使得當前執行緒進入阻塞狀態
不同點:兩個方法宣告位置不同,Thread類中宣告Sleep(),Object宣告在wait中
呼叫範圍不同:sleep可以在任何需要的場景下呼叫,wait必須在同步程式碼塊中
關於是否釋放同步監聽器:如果兩個方法都使用在同步程式碼塊或同步方法中,sleep不會釋放鎖,wait會釋放鎖