Java 线程 - 睡眠、等待和通知之间的区别

两种方法sleep()wait() 在一定时间后或由其他进程触发通知后暂停当前线程并恢复其执行路径。

wait 可以被另一个调用 notify重要的是 wait et notify 在块中调用 同步 用于相互排斥。方法 notify 唤醒触发 wait.

wait() 和 notify()

在这个程序中,进程 B 在进程 A 内部运行,并创建一个互斥区来阻止和阻止进程 A 在块之后执行语句 try/catch.

public class Thread_A {
public static void main(String[] args) {

Thread Thread_B = new Thread(new Runnable() {
@Override
public void run() {
synchronized (this) {
int i=0;
while(i<100)
i++;
//自由线程 A
notify();
}
}
});
Thread_B.start();

synchronized(Thread_B) {
try {
System.out.println(线程 A 被阻止 - 等待线程 B”+
完成”);
//暂停 A
Thread_B.wait();
} catch (InterruptedException e) {
// TODO 自动生成的 catch block
e.printStackTrace();
}
System.out.println(线程 B 已完成 - 线程 A 已释放”);
}
}
}
Output
线程 A 卡住 等待线程 B 完成
线程 B 已完成。线程 A 被释放

sleep()

The sleep()锁定进程并执行一段时间。此方法用于与时间同步(例如,4 秒后唤醒)或说 sleep 并让其他线程运行。

public class Sleep {

public static void main(String[] args) {
ThreadA a = new ThreadA();
a.start();
ThreadB b = 新 ThreadB();
b.start();
}

静态类 ThreadA extends Thread{
@Override
public void run() {
try {
System.out.println(线程 A”);
睡眠(4000);
System.out.println(线程 A:我睡了 4 秒钟”);
} catch (InterruptedException e) {
// TODO 自动生成的 catch block
e.printStackTrace();
}
}
}

静态类 ThreadB extends Thread{
@Override
public void run() {
System.out.println(线程 B”);
int sum = 0;
for(int i = 0 ; i < 50; i++)
sum +=i;
System.out.println(线程 B:我完成了”);
}
}
}
Output
线程 A
线程 B
线程 B:我完成了
线程 A:我睡了 4 秒
进程 A 在进程 B 之前启动,但 B 在进程 A 之前进行了处理睡着了,完成了第一个