等待和线程的确切区别
wait and thread exact difference
我明白了 Thread.sleep() 和 wait() 之间的区别。
The code sleep(1000);
puts thread aside for exactly one second.
The code wait(1000);
causes a wait of up to one second.
除了在对象 class 中等待和在线程 class 中休眠之外,这到底是什么意思?
有什么好的例子吗?
wait()
可以通过调用notify()
或notifyAll()
唤醒。
在此示例中,您可以看到 Blah1 没有等待 1000 毫秒,因为它早先被 Blah2 唤醒。 Blah2 等待。
wait()
方法释放被给定线程阻塞的监视器。 sleep()
没有。
sleep()
可以调用interrupt()
方法中断
public class Blah implements Runnable {
private String name;
public Blah(String name) {
this.name = name;
}
synchronized public void run() {
try {
synchronized (Blah.class) {
System.out.println(name + ": Before notify " + new Date().toString());
Blah.class.notifyAll();
System.out.println(name + ": Before wait " + new Date().toString());
Blah.class.wait(1000);
System.out.println(name + ": After " + new Date().toString());
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Thread th1 = new Thread(new Blah("Blah1"));
Thread th2 = new Thread(new Blah("Blah2"));
th1.start();
th2.start();
}
}
输出:
Blah1: Before notify Tue Jan 13 09:19:09 CET 2015
Blah1: Before wait Tue Jan 13 09:19:09 CET 2015
Blah2: Before notify Tue Jan 13 09:19:09 CET 2015
Blah2: Before wait Tue Jan 13 09:19:09 CET 2015
Blah1: After Tue Jan 13 09:19:09 CET 2015
Blah2: After Tue Jan 13 09:19:10 CET 2015
您在已同步的对象上调用 wait()
,它会释放监视器并等待在同一对象上调用 notify()
或 notifyAll()
。它通常用于在某些共享对象上协调 activity,例如请求或连接队列。
sleep()
不释放任何监视器或以其他方式直接与其他线程交互。相反,它保留所有监视器并简单地停止执行当前线程一点点。
我明白了 Thread.sleep() 和 wait() 之间的区别。
The code sleep(1000);
puts thread aside for exactly one second.
The code wait(1000);
causes a wait of up to one second.
除了在对象 class 中等待和在线程 class 中休眠之外,这到底是什么意思?
有什么好的例子吗?
wait()
可以通过调用notify()
或notifyAll()
唤醒。
在此示例中,您可以看到 Blah1 没有等待 1000 毫秒,因为它早先被 Blah2 唤醒。 Blah2 等待。
wait()
方法释放被给定线程阻塞的监视器。 sleep()
没有。
sleep()
可以调用interrupt()
方法中断
public class Blah implements Runnable {
private String name;
public Blah(String name) {
this.name = name;
}
synchronized public void run() {
try {
synchronized (Blah.class) {
System.out.println(name + ": Before notify " + new Date().toString());
Blah.class.notifyAll();
System.out.println(name + ": Before wait " + new Date().toString());
Blah.class.wait(1000);
System.out.println(name + ": After " + new Date().toString());
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Thread th1 = new Thread(new Blah("Blah1"));
Thread th2 = new Thread(new Blah("Blah2"));
th1.start();
th2.start();
}
}
输出:
Blah1: Before notify Tue Jan 13 09:19:09 CET 2015
Blah1: Before wait Tue Jan 13 09:19:09 CET 2015
Blah2: Before notify Tue Jan 13 09:19:09 CET 2015
Blah2: Before wait Tue Jan 13 09:19:09 CET 2015
Blah1: After Tue Jan 13 09:19:09 CET 2015
Blah2: After Tue Jan 13 09:19:10 CET 2015
您在已同步的对象上调用 wait()
,它会释放监视器并等待在同一对象上调用 notify()
或 notifyAll()
。它通常用于在某些共享对象上协调 activity,例如请求或连接队列。
sleep()
不释放任何监视器或以其他方式直接与其他线程交互。相反,它保留所有监视器并简单地停止执行当前线程一点点。