线程:等待/通知机制

  方法wait()

   方法wait()的作用是使当前执行代码的线程进行等待, wait()被执行后,锁被自动释放。wait()方法是Object类的方法,该方法用来将当前线程置入"预执行队列"中,并且在wait()所在的代码处停止执行,直到接到通知或被中断为止。

   方法notify()

   在执行完notify()方法后,当前线程不会马上释放该对象锁,呈wait状态的线程也并不能马上获取该对象锁,要等到执行notify()方法的线程将程序执行完,也就是退出synchronized代码块后,当前线程才会释放锁,而呈wait状态所在的线程才可以获取该对象锁。

   notify()方法一次只随机通知一个线程进行唤醒。

   notifyAll()方法唤醒所有线程。

wait(long)方法

   带一个参数的wait(long)方法的功能是等待某一时间是否有线程对锁进行唤醒,如果超过这个时间则自动唤醒。

public class Run {
	static private Object lock = new Object();
	static private Runnable runable1 = new Runnable(){
		@Override
		public void run() {
			synchronized(lock){
				try {
					System.out.println("wait begin timer" + System.currentTimeMillis());
					lock.wait(5000);
					System.out.println("wait   end timer" + System.currentTimeMillis());
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	};
	
	public static void main(String[] args){
		Thread t = new Thread(runable1);
		t.start();
	}
}

  

当interrupt方法遇到wait方法

  当线程呈wait状态时, 调用线程对象的interrupt()方法会出现InterruptedException异常.

public class Service {
	
	public void testMethod(Object lock){
		try{
			synchronized(lock){
				System.out.println("begin wait...");
				lock.wait();
				//Thread.sleep(10000);
				System.out.println("  end wait...");
			}
		}catch(InterruptedException e){
			e.printStackTrace();
			System.out.println("出现异常了,因为呈wait状态的线程被interrupt了 !");
		}
	}
}



public class ThreadA extends Thread{
	private Object lock;
	
	public ThreadA(Object lock){
		this.lock = lock;
	}
	
	@Override
	public void run(){
		Service service = new Service();
		service.testMethod(lock);
	}
}


public class Test {
	public static void main(String[] args){
		try{
			Object lock = new Object();
			ThreadA a = new ThreadA(lock);
			a.start();
			Thread.sleep(5000);
			a.interrupt();
		}catch(InterruptedException e){
			e.printStackTrace();
		}
	}
}

通过管道进行线程间通信: 字节流,字符流

  在jdk中, 提供了4个类来使线程间可以进行通信: 

   1). PipedInputStream 和 PipedOutputStream  处理字节流

   2). PipedReader和PipedWriter  处理字符流

发布了557 篇原创文章 · 获赞 40 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/m0_37564426/article/details/103380872