方法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 处理字符流