private final static ReentrantLock lock = new ReentrantLock();
private static final Condition cond = lock.newCondition();
@Override
public void run() {
lookStatus();
}
// 查看买票信息
private void lookStatus(){
try{
lock.lock();
int num = getNum();
// 打印哪个窗口(线程),买到哪张票
System.out.println(Thread.currentThread() +":"+num);
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
lock.unlock();
}
}
// 购票任务
private synchronized int getNum() throws InterruptedException{
int num = DBTicket.getTicket();
num = DBTicket.getNum();
num = 0;
while(num < 1){
System.out.println("");
// 进入等待
wait();
System.out.println("没票啦请等待加票...");
//addByThread();
num = DBTicket.getNum();
// 如果有票了,继续执行
if( num > 0){
notify();
break;
}
}
return num;
}
我main 里面创建N个线程执行的时候,发现wait 会停留不动,但是wait(1) 之后就好了,wait 默认是wait(0),我知道这里会释放锁,进入等待队列。但是为什么会造成这个原因呢?查看了一下,没有死锁!
问题补充:看这个简单 完全的代码,关于 wait() 停滞,wait(1) 执行的,原因,哪位能帮我分析一下:
public class Test implements Runnable {
private final static ReentrantLock lock = new ReentrantLock();
private static final Condition cond = lock.newCondition();
@Override
public void run() {
lookStatus();
}
// 查看买票信息
private void lookStatus(){
try{
lock.lock();
int num = getNum();
// 打印哪个窗口(线程),买到哪张票
System.out.println(Thread.currentThread() +":"+num);
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
lock.unlock();
}
}
// 购票任务
private synchronized int getNum() throws InterruptedException{
int num = 0;
while(num < 1){
// 进入等待
wait();
System.out.println("没票啦请等待加票...");
// 从新获得票数
num = 100;
// 如果有票了,继续执行
if( num > 0){
break;
}
}
return num;
}
public static void main(String[] args) throws Exception {
ExecutorService ex = Executors.newCachedThreadPool();
// 通过线程池, 模拟有3个窗口(线程),当然你可以建立不同的Thread 1 2 3
// 多执行几次
for(int i = 0;i<40;i++){
ex.execute(new Test());
ex.execute(new Test());
ex.execute(new Test());
}
ex.shutdown();
}
}
相关推荐
在Java中,`wait()` 和 `notify()` 方法是实现线程间通信和协作的重要工具,它们属于 `java.lang.Object` 类,这意味着所有类都默认继承了这两个方法。本文将详细探讨如何使用 `wait()` 和 `notify()` 来控制子线程...
理解它们的区别有助于编写出更加高效和可控的多线程程序。 1. **sleep() 方法** - `Thread.sleep(millisecond)` 方法来自 `java.lang.Thread` 类,它使当前正在执行的线程暂停指定的毫秒数,并将线程的执行权交还...
在本文中,我们将通过示例代码详细介绍Java多线程wait和notify的使用,帮助读者更好地理解和掌握这两个机制。 wait机制 在Java中,wait机制用于暂停当前线程的执行,并释放当前对象的锁,以便让其他线程获得锁并...
在Java多线程编程中,`wait()`和`notify()`是两个非常重要的方法,它们用于线程间的协作和通信。这两个方法是Java语言中的Object类提供的,因此所有的对象都可以使用。在本文中,我们将深入探讨如何使用主线程来控制...
#### `wait()`与`suspend()`/`sleep()`的区别 `wait()`、`suspend()`以及`sleep()`都可以让线程暂停执行,但它们之间存在显著差异: - **`suspend()`**:已废弃,它会使线程暂停并保持锁的持有权,导致死锁风险...
"解决TIME_WAIT过多造成的问题1" TIME_WAIT状态是TCP连接的四次挥手关闭协议中的一个重要状态,它存在的理由是为了确保TCP全双工连接的正常终止和避免老的重复分节在网络中消逝。 在TIME_WAIT状态中,客户端必须...
sleep() 方法和 wait() 方法都是 Java 中的线程控制方法,但是它们有着本质的区别。下面是对这两种方法的详细比较和分析。 sleep() 方法 sleep() 方法是 Thread 类的静态方法,它的主要作用是使当前线程进入停滞...
1. **wait()**:这个方法会让当前持有对象锁的线程进入等待状态,释放对象锁,让其他线程有机会获取锁。等待的线程必须在某个对象的监视器上等待,即在线程进入同步代码块或同步方法之前调用`wait()`。线程只有被...
在Java并发编程中,`wait()`和`notify()`是非常重要的同步机制,它们通常与`synchronized`关键字一起使用,帮助开发者解决线程间的协作问题。本文将深入探讨`wait()`和`notify()`的工作原理以及如何正确地使用它们。...
在Java多线程编程中,wait和notify是两个非常重要的方法,它们都是Object类的方法,用于线程之间的通信和同步。下面我们将详细解释wait和notify的用法。 wait方法 wait方法是Object类的一个方法,用于让当前线程...
多线程中的lock,Monitor_Wait和Monitor_Pulse,几种重要同步方法你一定要知道哦
综上所述,`wait()`是Java多线程编程中的关键工具,正确使用它可以实现复杂的线程同步和协作策略。理解其工作原理和使用场景,有助于编写出高效、稳定的多线程程序。在实际应用中,应结合`notify()`和`notifyAll()`...
Java中的多线程设计涉及到许多核心概念,其中wait/notify机制是实现线程间通信和协作的关键工具。这个机制主要用于解决资源的分配和同步问题,它依赖于Java的内置锁机制,即`synchronized`关键字和对象锁。 首先,...
`synchronized`关键字、`wait()`和`notify()`方法是Java多线程中用于控制并发访问共享资源的重要工具,它们是Java内存模型(JMM)的一部分,主要用于解决线程间的同步问题。 一、`synchronized`关键字 `...
本文将总结五个关键的线程控制方法:wait()、await()、sleep()、yield()和join()。这些方法各自有独特的用途和不同的工作机制。 一、wait()、notify()、notifyAll()用法 wait()、notify()和notifyAll()是Object类...
Java多线程通讯之wait、notify的区别详解 Java多线程通讯是指在多线程编程中,线程之间如何进行通讯和同步的问题。其中,wait和notify是两个非常重要的方法,用于控制线程的状态和同步。 wait方法: wait方法是...
另外,wait()和notify()、notifyAll()方法用于线程间的通信,实现线程的互斥和协作。 四、线程优先级 Java线程有10个优先级,从MIN_PRIORITY(1)到MAX_PRIORITY(10),默认优先级是NORM_PRIORITY(5)。线程优先级高的...
Java线程中的`sleep()`和`wait()`方法都是在多线程环境中用于控制线程执行的重要工具,但它们之间存在着显著的区别。理解这些差异对于编写高效、正确的并发代码至关重要。 首先,Java的多线程机制基于抢占式模型,...
总结来说,`pthread_cond_wait()` 是一个强大的工具,用于实现线程间的同步和协作。正确使用它可以有效地避免竞争条件,提高多线程程序的效率和可靠性。但是,不当使用可能会导致死锁或其他并发问题,因此在编程时...
Java中的`wait()`和`notify()`方法是多线程编程中的关键工具,用于线程间的同步和通信。这两个方法都是Object类的成员,这意味着所有Java对象都可以使用它们。`wait()`方法使当前线程暂停执行并释放它持有的锁,直到...