如何在不是线程的对象上调用wait()和notify()方法?那真的没有意义,是吗?
当然,它必须有意义,因为这两种方法可用于所有Java对象.有人可以提供解释吗?我无法理解如何使用wait()和之间的线程之间进行通信notify().
如果我有一个线程被阻塞等待锁,操作系统可以重新安排该线程去做其他工作,直到锁可用吗?根据我的理解,它不能被重新安排,它只是闲置直到它能够获取锁。但这似乎效率很低。如果我们有 100 个任务提交给 ExecutorService,并且池中有 10 个线程:如果其中一个线程持有锁,而其他 9 个线程正在等待该锁,则只有持有锁的线程才能取得进展。我本以为被阻塞的线程可以暂时重新安排来运行其他一些提交的任务。
我试图了解 Javawait和notify方法的工作原理。根据文档,wait()导致线程等待对notify()或notifyAll()方法的后续调用,但由于某种原因notify不会中断“等待”:
public static void main(String[] args) {
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("thread1 is started, waiting for notify()");
synchronized (this) {
try {
wait();
} catch (InterruptedException e) {
System.out.println(e.getLocalizedMessage());
}
}
System.out.println("waiting is over");
}
});
thread1.start();
// unblock thread1 in 2 seconds
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (thread1) {
thread1.notify();
}
}
Run Code Online (Sandbox Code Playgroud) 我试图让线程池的基础知识非常强大。我了解到它在内部使用阻塞队列来“窃取”任务并将它们运行到池中的给定线程中。这意味着如果我有 10 个任务和 5 个线程,它只能同时运行 5 个任务,直到 1 个任务完全完成。
问题是:为什么不并发?为什么不只是对这 10 个任务进行时间切片?这个实现的原因是什么?
有人在采访中问过我这个问题。我不确定这是否是一个有效的问题。如果是请回复。谢谢