- 浏览: 565977 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (344)
- ··············未分类············· (33)
- Eclipse 插件 (15)
- EDA 工具 (1)
- Linux/Unix (3)
- Java (43)
- Java Applet (1)
- Java Draw2d (22)
- Java Draw2d version2 (6)
- Java GEF (2)
- Java SWT (21)
- Java SWT Image 图像 (21)
- Java SWT Tree (16)
- Java SWT Table (4)
- Java SWT TableViewer (11)
- Java SWTbot (4)
- Java Test (2)
- Java Thread 多线程 (22)
- Java Zest (5)
- RC2_3S400学习笔记 (16)
- tcl 脚本 (10)
- Verilog (7)
- XML (6)
- 国家 (5)
- 感叹 (4)
- 面试题 (9)
- 生活 (36)
- 足球 世界杯 (8)
- 老公看你的 (3)
- web开发 (1)
- 数据结构——图 (7)
- c language (1)
最新评论
-
zxjlwt:
路过素人派http://surenpi.com
SWT 树的事件 SWT.Selection SWT.CHECK SWT.DefaultSelection -
hj01kkk:
1楼用法正解
JDK 7 中的 Fork/Join 模式 -
fish_no7:
使用 new SortTask().fork()
JDK 7 中的 Fork/Join 模式 -
wpf523:
mark
Java 多线程例子6 线程安全 线程同步 同步代码块 同步函数 -
uniquejava:
以前碰到过,估计是在icu包中实现了双击自动选中一段文本的功能 ...
java.lang.NoClassDefFoundError: com/ibm/icu/text/BreakIterator
回答问题:http://www.iteye.com/problems/46763
有三方:厂家,电脑城,顾客
厂家2个,一个生产主板,一个生产显卡。
顾客有2个,他们各自不断购买主板和显卡。
电脑城有一个,卖显卡和主板。
class ComputerCenter { private static Object VIDEO = new Object(); private static Object MAINB = new Object(); private static Integer videoN = 10; private static Integer MainbN = 10; public void stockVd() { synchronized(VIDEO) { if(videoN >= 20) { System.out.println("ComputerCenter: the VC storage is MAX"); try {VIDEO.wait();} catch (Exception e) {} } System.out.println("ComputerCenter: 厂商送来一块显卡。"); videoN++; VIDEO.notify();//----------------------------唤醒消费者消费 } } public void stockMd() { synchronized(MAINB) { if(MainbN >= 20) { System.out.println("ComputerCenter: the MB storage is MAX"); try {MAINB.wait();} catch (Exception e) {} } System.out.println("ComputerCenter: 厂商送来一块主板。"); MainbN++; MAINB.notify();//-----------------------------唤醒消费者消费 } } public void sellVd(String name) { synchronized(VIDEO) { if(videoN <= 0) { System.out.println("没有显卡了,等等,马上送来!!!!!!!!!"); try {VIDEO.wait();} catch (Exception e) {} } System.out.println(name + " : 买走一块显卡。"); videoN--; VIDEO.notify();//----------------------------------唤醒厂商 } } public void sellMd(String name) { synchronized(MAINB) { if(MainbN <= 0) { System.out.println("没有主板了,等等,马上送来!!!!!!!!!!"); try {MAINB.wait();} catch (Exception e) {} } System.out.println(name + " : 买走一块主板。"); MainbN--; MAINB.notify();//----------------------------------唤醒厂商 } } public static void main(String[] args) { ComputerCenter MyCC = new ComputerCenter(); new customer(MyCC,"Jack").start(); new customer(MyCC,"Tom").start(); new Md_retailer(MyCC).start(); new Vd_retailer(MyCC).start(); } } class customer extends Thread { private ComputerCenter cc; private String name; public customer(ComputerCenter cc,String name) { this.cc = cc; this.name = name; } public void run() { while(true) { //try {Thread.sleep(10);} catch (Exception e) {} //顾客不断购买显卡和主板 cc.sellVd(name); cc.sellMd(name); } } } class Md_retailer extends Thread { private ComputerCenter cc; public Md_retailer(ComputerCenter cc) { this.cc = cc; } public void run() { while(true) { try {Thread.sleep(10);} catch (Exception e) {} cc.stockMd(); } } } class Vd_retailer extends Thread { private ComputerCenter cc; public Vd_retailer(ComputerCenter cc) { this.cc = cc; } public void run() { while(true) { try {Thread.sleep(10);} catch (Exception e) {} cc.stockVd(); } } }
上面的程序,没有考虑到,顾客a和顾客b可以相互叫醒,导致卖出的数量是负值了。
改进,等待进入后再判断。
class ComputerCenter { private static Object VIDEO = new Object(); private static Object MAINB = new Object(); private static Integer videoN = 10; private static Integer MainbN = 10; public void stockVd() { synchronized(VIDEO) { if(videoN >= 20) { System.out.println("ComputerCenter: the VC storage is MAX"); try {VIDEO.wait();} catch (Exception e) {} } videoN++; System.out.println("ComputerCenter: 厂商送来一块显卡。" + videoN); VIDEO.notify();//----------------------------唤醒消费者消费 } } public void stockMd() { synchronized(MAINB) { if(MainbN >= 20) { System.out.println("ComputerCenter: the MB storage is MAX"); try {MAINB.wait();} catch (Exception e) {} } MainbN++; System.out.println("ComputerCenter: 厂商送来一块主板。"+MainbN); MAINB.notify();//-----------------------------唤醒消费者消费 } } public void sellVd(String name) { synchronized(VIDEO) { if(videoN <= 0) { System.out.println("没有显卡了,等等,马上送来!!!!!!!!!"); try {VIDEO.wait();} catch (Exception e) {} } if(videoN >0) { System.out.println(name + " : 买走一块显卡。"+videoN); videoN--; } VIDEO.notify();//----------------------------------唤醒厂商 } } public void sellMd(String name) { synchronized(MAINB) { if(MainbN <= 0) { System.out.println("没有主板了,等等,马上送来!!!!!!!!!!"); try {MAINB.wait();} catch (Exception e) {} } if(MainbN >0) { System.out.println(name + " : 买走一块主板。"+MainbN); MainbN--; } MAINB.notify();//----------------------------------唤醒厂商 } } public static void main(String[] args) { ComputerCenter MyCC = new ComputerCenter(); new customer(MyCC,"Jack").start(); new customer(MyCC,"Tom").start(); new Md_retailer(MyCC).start(); new Vd_retailer(MyCC).start(); } } class customer extends Thread { private ComputerCenter cc; private String name; public customer(ComputerCenter cc,String name) { this.cc = cc; this.name = name; } public void run() { while(true) { //try {Thread.sleep(10);} catch (Exception e) {} //顾客不断购买显卡和主板 cc.sellVd(name); cc.sellMd(name); } } } class Md_retailer extends Thread { private ComputerCenter cc; public Md_retailer(ComputerCenter cc) { this.cc = cc; } public void run() { while(true) { try {Thread.sleep(10);} catch (Exception e) {} cc.stockMd(); } } } class Vd_retailer extends Thread { private ComputerCenter cc; public Vd_retailer(ComputerCenter cc) { this.cc = cc; } public void run() { while(true) { try {Thread.sleep(10);} catch (Exception e) {} cc.stockVd(); } } }
网友说了,这种卖电脑的叫人家来了,又可能买不到的情况存在。
class ComputerCenter { private static Object VIDEO = new Object(); private static Object MAINB = new Object(); private static Integer videoN = 10; private static Integer MainbN = 10; public void stockVd() { synchronized(VIDEO) { if(videoN >= 20) { System.out.println("ComputerCenter: the VC storage is MAX"); } else { videoN++; System.out.println("ComputerCenter: 厂商送来一块显卡。" + videoN); VIDEO.notify();//----------------------------唤醒消费者消费 } } } public void stockMd() { synchronized(MAINB) { if(MainbN >= 20) { System.out.println("ComputerCenter: the MB storage is MAX"); } else { MainbN++; System.out.println("ComputerCenter: 厂商送来一块主板。"+MainbN); MAINB.notify();//-----------------------------唤醒消费者消费 } } } public void sellVd(String name) { synchronized(VIDEO) { if(videoN <= 0) { System.out.println("没有显卡了,等等,马上送来!!!!!!!!!"); try {VIDEO.wait();} catch (Exception e) {} } System.out.println(name + " : 买走一块显卡。"+videoN); videoN--; } } public void sellMd(String name) { synchronized(MAINB) { if(MainbN <= 0) { System.out.println("没有主板了,等等,马上送来!!!!!!!!!!"); try {MAINB.wait();} catch (Exception e) {} } System.out.println(name + " : 买走一块主板。"+MainbN); MainbN--; } } public static void main(String[] args) { ComputerCenter MyCC = new ComputerCenter(); new customer(MyCC,"Jack").start(); new customer(MyCC,"Tom").start(); new Md_retailer(MyCC).start(); new Vd_retailer(MyCC).start(); } } class customer extends Thread { private ComputerCenter cc; private String name; public customer(ComputerCenter cc,String name) { this.cc = cc; this.name = name; } public void run() { while(true) { //try {Thread.sleep(10);} catch (Exception e) {} //顾客不断购买显卡和主板 cc.sellVd(name); cc.sellMd(name); } } } class Md_retailer extends Thread { private ComputerCenter cc; public Md_retailer(ComputerCenter cc) { this.cc = cc; } public void run() { while(true) { try {Thread.sleep(10);} catch (Exception e) {} cc.stockMd(); } } } class Vd_retailer extends Thread { private ComputerCenter cc; public Vd_retailer(ComputerCenter cc) { this.cc = cc; } public void run() { while(true) { try {Thread.sleep(10);} catch (Exception e) {} cc.stockVd(); } } }
发表评论
-
多线程的Wait返回它等待的下方
2014-08-15 14:16 558多线程的Wait返回它等待的下方。 Java Code ... -
多线程构造函数
2014-04-04 11:50 2093http://hi.baidu.com/tengxiaofe ... -
关于volatile
2013-01-28 13:24 607Volatile修饰的成员变量在每次被线程访问时,都强迫从共享 ... -
java Thread 停止 开始 暂停
2010-07-23 15:07 241691,写了一个小程序: public class TestTh ... -
【转载】java Timer TimerTask
2010-07-22 11:31 18231,Timer Timer的实质上就是一个多线程,从它的类中 ... -
【转载】DelayQueue 的使用
2010-07-20 20:15 1341原文:http://ideasforjava.iteye.co ... -
多线程 CyclicBarrier
2010-07-20 19:38 967原文:http://blog.csdn.net/qian_34 ... -
java多线程 Semaphore CountDownLatch ScheduledExecutorService
2010-07-20 17:06 1843参考:http://www.ibm.com/developer ... -
java多线程 BlockingQueue 和 SynchronousQueues
2010-07-20 15:30 1464参考:http://www.ibm.com/developer ... -
利用多核CPU计算大的列表中的整数和 CyclicBarrier CountDownLatch ExecutorService
2010-07-20 14:12 1317原文:http://flysnow.iteye.c ... -
JDK 7 中的 Fork/Join 模式
2010-07-20 10:59 1885参考1:http://www.ibm.com/develope ... -
Java 多线程例子10 控制线程的生命 stop
2010-07-19 21:13 1306在Thread类中stop已经不推荐大家使用了,因为使用sto ... -
Java 多线程例子9 线程之间通信 wait notify notifyAll
2010-07-19 20:07 2859下面参照《Java就业培训教材》写了一个相似的线程之间通信的例 ... -
Java 多线程例子8 线程状态
2010-07-19 17:27 1237原文:http://shihaiyang.iteye.com/ ... -
Java 多线程例子7 线程安全 死锁
2010-07-19 17:07 1523死锁:在多个线程里对多个同步对象具有循环依赖时常会出现死锁。最 ... -
Java 多线程例子6 线程安全 线程同步 同步代码块 同步函数
2010-07-18 18:06 2315线程安全 出现线程安 ... -
Java 多线程例子5 实际例子的讨论
2010-07-18 15:18 10221,网络聊天程序,如QQ。 发送信息和接受信息肯定要连个线程 ... -
Java 多线程例子4 继承Thread 实现Runnable
2010-07-16 19:48 17221,Runnable例子 class ThreadDemo ... -
Java 多线程例子3 联合线程 join()
2010-07-16 17:57 22731,联合线程实际上就是 ... -
Java 多线程例子2 前台线程(用户线程) 后台线程(守护线程 ) setDaemon
2010-07-16 15:16 28851,setDaemon(true)后就是后台线程(守护线程 ) ...
相关推荐
源码—Java多线程5—死锁和wait notify notifyAll
总结一下,`wait()`, `notify()`, 和 `notifyAll()` 是Java多线程编程中的核心工具,它们与`synchronized`关键字一起,为线程间的协作提供了强大的支持。理解并熟练掌握这些概念,对于编写高效、安全的多线程程序至...
- 等待/通知机制:`wait()`, `notify()`, `notifyAll()`方法用于线程间的通信。这些方法必须在`synchronized`环境中使用,避免线程安全问题。 - `volatile`关键字:用于标记共享变量,确保多线程环境下的可见性和...
本文将基于"java 多线程并发实例"这个主题,深入探讨Java中的多线程并发概念及其应用。 首先,我们要了解Java中的线程。线程是程序执行的基本单元,每个线程都有自己的程序计数器、虚拟机栈、本地方法栈,而共享堆...
总结来说,Java的 `wait()` 和 `notify()` 提供了一种在多线程环境中控制线程执行的机制。通过合理使用这些方法,我们可以实现线程间的协作,精确控制子线程的运行状态。然而,这种方式虽然灵活,但管理起来相对复杂...
Java中,可以通过wait()、notify()和notifyAll()这三个Object类的方法来实现线程间的通信。这些方法必须在同步环境中使用,否则会抛出异常。此外,Java 5引入了BlockingQueue阻塞队列,它是一种线程安全的数据结构,...
Java多线程是Java编程语言中一个非常重要的概念,它允许开发者在一个程序中创建多个执行线程并行运行,以提高程序的执行效率和响应速度。在Java中,线程的生命周期包含五个基本状态,分别是新建状态(New)、就绪...
Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应性。在Java中,实现多线程有两种主要方式:通过实现`Runnable`接口或者继承`Thread`类。 首先,让我们从创建线程开始。当你...
《汪文君JAVA多线程编程实战》是一本专注于Java多线程编程的实战教程,由知名讲师汪文君倾力打造。这本书旨在帮助Java开发者深入理解和熟练掌握多线程编程技术,提升软件开发的效率和质量。在Java平台中,多线程是...
Java多线程机制是Java编程中至关重要的一部分,它允许程序同时执行多个任务,提升应用程序的效率和响应性。以下是对各个知识点的详细说明: 9.1 Java中的线程: Java程序中的线程是在操作系统级别的线程基础上进行...
Java中多线程编程中,wait、notify、notifyAll三个方法是非常重要的,它们都是Object对象的方法,用于线程之间的通信。下面我们将详细介绍这三个方法的使用和作用。 一、wait()方法 wait()方法是使当前线程自动...
本文将深入探讨Java多线程中的关键知识点,包括创建线程、主线程、线程优先级、线程组、线程同步以及线程间的通信。 1. **创建线程** 在Java中,可以通过两种方式创建线程:继承`Thread`类或实现`Runnable`接口。...
3. **线程同步与并发控制**:论文会深入讲解JAVA中的线程同步机制,如synchronized关键字、wait()、notify()和notifyAll()方法,以及Lock接口和ReentrantLock类的使用。此外,可能会探讨并发工具类,如Semaphore、...
wait()、notify()和notifyAll()方法用于线程间的通信,使得线程可以等待特定条件满足后再继续执行;还有volatile关键字保证了多线程环境下的可见性和有序性,避免了线程缓存造成的数据不一致。 在这个实例中,我们...
Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应性。在Java中,实现多线程有两种主要方式:通过继承`Thread`类和实现`Runnable`接口。 1. 继承Thread类: 当你需要创建一...
2. 线程通信:wait()、notify()和notifyAll()方法用于线程间的通信。在生产者消费者模型或其他同步问题中,这些方法起到关键作用。 3. 线程状态:线程有新建、就绪、运行、阻塞和终止五种状态。实例可能涉及线程的...
在Java多线程编程中,wait和notify是两个非常重要的方法,它们都是Object类的方法,用于线程之间的通信和同步。下面我们将详细解释wait和notify的用法。 wait方法 wait方法是Object类的一个方法,用于让当前线程...
2. wait()、notify()和notifyAll():这些方法在Object类中定义,用于线程间的通信和协作。它们必须在同步环境中使用,以避免死锁。 3. Lock接口和ReentrantLock类:Java 5引入了Lock接口,提供了比synchronized更细...
1. wait()、notify()和notifyAll():这三个方法用于线程间的通信,它们必须在同步环境中使用。 2. Condition接口:配合Lock使用,提供更灵活的线程间通信方式。 五、线程池 1. Executor框架:Java 5引入的...
标签“多线程”强调了Java并发编程的核心概念,如线程的创建、同步、通信和状态管理。例如,`synchronized`关键字用于确保对共享资源的互斥访问,防止数据竞争;`wait()`, `notify()`和`notifyAll()`方法用于线程间...