线程中的notify和wait的问题.

chenzhehui 2009-07-16 04:22:17
class ThreadA
{
public static void main(String[] args)
{
ThreadB b=new ThreadB();
b.start();
System.out.println("b is start....");
synchronized(b)
{
try
{
System.out.println("Waiting for b to complete...");
b.wait();
System.out.println("Completed.Now back to main thread");
}catch (InterruptedException e){}
}
System.out.println("Total is :"+b.total);
}
}


class ThreadB extends Thread
{
int total;
public void run()
{
synchronized(this)
{
System.out.println("ThreadB is running..");
for (int i=0;i<100;i++ )
{
total +=i;
System.out.println("total is "+total);
}
notify();
}
}
}


我对这里有点不明白,我不明白的地方是,在主方法里面,用b.start()启动线程,然而,这只是使线程准备,不能确定是否马上执行这个线程,然而,在这里,该线程的run()里面有个同步块,里面调用了notify(),目的用来唤醒自己的.
而使线程wait的也是在主方法那里,
我想知道的是:
如果程序开始的时候就马上执行了线程的run()方法,而那时候的b.wait()还没被调用,那么run()中的notify都被执行了,这样的话不是把主方法的b.wait() 白写了吗?

我想知道这个程序的执行顺序.
谢谢
...全文
53 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenzhehui 2009-07-18
  • 打赏
  • 举报
回复
synchronized(b)
{
try
{
System.out.println("Waiting for b to complete...");
b.wait();
System.out.println("Completed.Now back to main thread");
}

问题我清晰很多了.
如果是上面的代码的话,这的有可能出现死锁.经多次试验证明.
然而.上面代码可以优化.加一个条件判断然后再调用wait,这样可以防止死锁情况出现.
最后,谢谢大家
greenwater007 2009-07-16
  • 打赏
  • 举报
回复
upupiup
chenzhehui 2009-07-16
  • 打赏
  • 举报
回复
这个类的确是一个自写类,但是不是我写的,我是在网上看到的一个例子.算经典的了
我只想知道他们的执行顺序.
txf_7337 2009-07-16
  • 打赏
  • 举报
回复
一般B打印100行时,A老早就在等待锁状态了。除非:B的优先级最高,A的优先级最低,有可能出现死锁。
txf_7337 2009-07-16
  • 打赏
  • 举报
回复
我电脑是单核的,对这个程序而言,出现死锁的几率很小,不知道双核的怎样?
Asinzy 2009-07-16
  • 打赏
  • 举报
回复
你这是一个学习线程的自写类么?
源码来自:https://pan.quark.cn/s/a4b39357ea24 《C++ Primer》作为C++编程领域的一部权威著作,主要服务于初学者和经验丰富的开发者,致力于帮助他们深入掌握C++的核心知识。 第一章通常会详细讲解C++语言的基础概念和语法结构,包括变量的使用、数据类型的分类、常量的定义、运算符的应用以及基础的输入输出操作。 接下来,我们将对这一章的核心知识点和可能的习题解答进行深入分析。 ### 1. 变量与数据类型在C++编程,变量被视为存储数据的媒介。 每一个变量都必须预先声明其数据类型,常见的数据类型有整型(int)、浮点型(float)、双精度浮点型(double)以及字符型(char)。 例如:```cppint age = 25; // 声明一个整型变量age并赋予其初始值25float weight = 70.5f; // 声明一个浮点型变量weight并赋予其初始值70.5char grade = A; // 声明一个字符型变量grade并赋予其初始值A```### 2. 常量与字面量常量指的是不可更改的值,可以通过`const`关键字进行声明。 例如:```cppconst int MAX_SIZE = 100; // 声明一个整型常量MAX_SIZE,其值为100```字面量是指程序直接书写的值,如`42`、`3.14`或`"Hello"`。 ### 3. 运算符C++提供了多种运算符,涵盖了算术运算符(+,-,*,/,%)、比较运算符(==,!=,<,>,<=,>=)、逻辑运算符(&&,||,!)以及赋值运算符(=,+=,-=,*=,/=,%=)等。 ### 4. 输入与输出在C++,使用`std::cin`来实现输...
内容概要:本文详细介绍了一个基于C++的仓库存储管理系统的设计与实现,涵盖了项目背景、目标、挑战及解决方案,并系统阐述了整体架构设计、数据库建模、功能模块划分、权限安全、并发控制、数据一致性保障、异常处理与可扩展性等关键内容。通过面向对象编程思想,采用分层架构与模块化解耦设计,结合STL容器、多线程、锁机制等C++核心技术,实现了高效的库存管理功能,包括入库、出库、盘点、调拨、权限控制、日志追踪与智能报表分析。文还提供了核心类如Inventory(库存)、User(用户权限)、LogEntry(操作日志)及WarehouseManager(主控制器)的代码示例,展示了数据结构设计与关键算法逻辑。; 适合人群:具备C++编程基础,熟悉面向对象设计与基本数据结构的软件开发人员,尤其适合从事企业级管理系统开发或希望深入理解系统架构设计的级开发者(工作1-3年);也适用于计算机相关专业学生进行课程设计或毕业项目参考; 使用场景及目标:①学习如何使用C++构建复杂业务系统的整体架构与模块划分方法;②掌握高并发、数据一致性、权限控制、异常处理等企业级系统关键技术的实现思路;③理解仓储管理业务流程及其在软件系统的建模与落地方式;④为开发类似ERP、MES等后台管理系统提供技术原型与设计参考; 阅读建议:此资源不仅提供理论架构与代码片段,更强调系统设计的完整性与工程实践性。建议读者结合代码示例动手实现核心模块,深入理解类之间的关系与交互逻辑,重点关注多线程安全、事务管理与权限校验等难点环节,并尝试扩展功能如对接GUI界面或数据库持久化模块,以全面提升系统开发能力。
内容概要:本文深入探讨了在大规模计算机竞赛场景下,基于分布式架构的Session管理与实现方案,重点分析了粘性会话与无粘会话、Session复制、集式存储(如Redis Cluster)、故障转移等关键技术,并结合Node.js + Express + Redis的高可用实现案例,展示了如何通过一致性哈希、双写策略、分层存储、灰度发布等核心技巧保障系统稳定性与用户体验。代码层面详细解析了集群部署、Session共享、答题记录存储、安全机制及自动恢复能力,全面支撑全球同步赛、实时直播赛等高并发场景。; 适合人群:具备一定后端开发经验,熟悉Web会话机制、Redis及Node.js的技术人员,尤其是参与高并发系统设计或竞赛平台开发的1-5年工作经验者; 使用场景及目标:①构建支持跨地域、高可用的分布式竞赛系统;②实现Session在多节点间的无缝共享与容灾恢复;③应对突发流量下的弹性扩容与故障自愈;④提升实时交互类应用的数据一致性与安全性; 阅读建议:此资源强调理论与实践结合,建议读者在理解架构设计理念的同时,动手搭建示例环境,深入调试代码逻辑,重点关注Redis集成、Cluster模式运行及安全配置细节,以掌握分布式Session的核心实现路径。

62,629

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧