0 0

关于 线程 wait() 和wait(1) 区别5

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();
}
}
2013年4月09日 17:05

1个答案 按时间排序 按投票排序

0 0

wait()会释放锁,但是会导致当前线程等待,直到被唤醒
wait(timeout)会释放锁,导致当前线程等待timeout的时间,或者被唤醒

代码里没有线程去唤醒调用wait()的线程,看起来就像是线程假死了,不会有输出

ps:做线程测试,最好不要使用线程池,不是每一个任务都对应一个线程的。

2013年4月09日 18:28

相关推荐

    Java多线程wait和notify

    在Java中,`wait()` 和 `notify()` 方法是实现线程间通信和协作的重要工具,它们属于 `java.lang.Object` 类,这意味着所有类都默认继承了这两个方法。本文将详细探讨如何使用 `wait()` 和 `notify()` 来控制子线程...

    多线程sleep,yield,wait区别

    理解它们的区别有助于编写出更加高效和可控的多线程程序。 1. **sleep() 方法** - `Thread.sleep(millisecond)` 方法来自 `java.lang.Thread` 类,它使当前正在执行的线程暂停指定的毫秒数,并将线程的执行权交还...

    浅谈java多线程wait,notify

    在本文中,我们将通过示例代码详细介绍Java多线程wait和notify的使用,帮助读者更好地理解和掌握这两个机制。 wait机制 在Java中,wait机制用于暂停当前线程的执行,并释放当前对象的锁,以便让其他线程获得锁并...

    主线程去控制子线程wait与notify

    在Java多线程编程中,`wait()`和`notify()`是两个非常重要的方法,它们用于线程间的协作和通信。这两个方法是Java语言中的Object类提供的,因此所有的对象都可以使用。在本文中,我们将深入探讨如何使用主线程来控制...

    一个理解wait()与notify()的例子

    #### `wait()`与`suspend()`/`sleep()`的区别 `wait()`、`suspend()`以及`sleep()`都可以让线程暂停执行,但它们之间存在显著差异: - **`suspend()`**:已废弃,它会使线程暂停并保持锁的持有权,导致死锁风险...

    解决TIME_WAIT过多造成的问题1

    "解决TIME_WAIT过多造成的问题1" TIME_WAIT状态是TCP连接的四次挥手关闭协议中的一个重要状态,它存在的理由是为了确保TCP全双工连接的正常终止和避免老的重复分节在网络中消逝。 在TIME_WAIT状态中,客户端必须...

    sleep() 方法和wait()方法的区别.docx

    sleep() 方法和 wait() 方法都是 Java 中的线程控制方法,但是它们有着本质的区别。下面是对这两种方法的详细比较和分析。 sleep() 方法 sleep() 方法是 Thread 类的静态方法,它的主要作用是使当前线程进入停滞...

    Java 同步方式 wait和notify/notifyall

    1. **wait()**:这个方法会让当前持有对象锁的线程进入等待状态,释放对象锁,让其他线程有机会获取锁。等待的线程必须在某个对象的监视器上等待,即在线程进入同步代码块或同步方法之前调用`wait()`。线程只有被...

    java多线程设计wait.docx

    在Java并发编程中,`wait()`和`notify()`是非常重要的同步机制,它们通常与`synchronized`关键字一起使用,帮助开发者解决线程间的协作问题。本文将深入探讨`wait()`和`notify()`的工作原理以及如何正确地使用它们。...

    java之wait,notify的用法([ 详解+实例 ])

    在Java多线程编程中,wait和notify是两个非常重要的方法,它们都是Object类的方法,用于线程之间的通信和同步。下面我们将详细解释wait和notify的用法。 wait方法 wait方法是Object类的一个方法,用于让当前线程...

    多线程中的lock,Monitor_Wait和Monitor_Pulse

    多线程中的lock,Monitor_Wait和Monitor_Pulse,几种重要同步方法你一定要知道哦

    wait()编程wait()编程wait()编程wait()编程

    综上所述,`wait()`是Java多线程编程中的关键工具,正确使用它可以实现复杂的线程同步和协作策略。理解其工作原理和使用场景,有助于编写出高效、稳定的多线程程序。在实际应用中,应结合`notify()`和`notifyAll()`...

    java多线程设计wait[参考].pdf

    Java中的多线程设计涉及到许多核心概念,其中wait/notify机制是实现线程间通信和协作的关键工具。这个机制主要用于解决资源的分配和同步问题,它依赖于Java的内置锁机制,即`synchronized`关键字和对象锁。 首先,...

    Java的sychronized、wait和notify范例

    `synchronized`关键字、`wait()`和`notify()`方法是Java多线程中用于控制并发访问共享资源的重要工具,它们是Java内存模型(JMM)的一部分,主要用于解决线程间的同步问题。 一、`synchronized`关键字 `...

    Java线程中wait,await,sleep,yield,join用法总结.pdf

    本文将总结五个关键的线程控制方法:wait()、await()、sleep()、yield()和join()。这些方法各自有独特的用途和不同的工作机制。 一、wait()、notify()、notifyAll()用法 wait()、notify()和notifyAll()是Object类...

    Java多线程通讯之wait,notify的区别详解

    Java多线程通讯之wait、notify的区别详解 Java多线程通讯是指在多线程编程中,线程之间如何进行通讯和同步的问题。其中,wait和notify是两个非常重要的方法,用于控制线程的状态和同步。 wait方法: wait方法是...

    java关于线程的实验代码

    另外,wait()和notify()、notifyAll()方法用于线程间的通信,实现线程的互斥和协作。 四、线程优先级 Java线程有10个优先级,从MIN_PRIORITY(1)到MAX_PRIORITY(10),默认优先级是NORM_PRIORITY(5)。线程优先级高的...

    Java线程中sleep和wait的区别详细介绍

    Java线程中的`sleep()`和`wait()`方法都是在多线程环境中用于控制线程执行的重要工具,但它们之间存在着显著的区别。理解这些差异对于编写高效、正确的并发代码至关重要。 首先,Java的多线程机制基于抢占式模型,...

    pthread_cond_wait() 用法深入分析

    总结来说,`pthread_cond_wait()` 是一个强大的工具,用于实现线程间的同步和协作。正确使用它可以有效地避免竞争条件,提高多线程程序的效率和可靠性。但是,不当使用可能会导致死锁或其他并发问题,因此在编程时...

    详细分析java线程wait和notify

    Java中的`wait()`和`notify()`方法是多线程编程中的关键工具,用于线程间的同步和通信。这两个方法都是Object类的成员,这意味着所有Java对象都可以使用它们。`wait()`方法使当前线程暂停执行并释放它持有的锁,直到...

Global site tag (gtag.js) - Google Analytics