- 浏览: 563398 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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
下面参照《Java就业培训教材》写了一个相似的线程之间通信的例子,程序实现了一个生产者和一个消费者,还有一个buffer用于存放生产出来的一个对象,buffer中只可以存放一个对象,buffer有一个标志位bFull,如果标志位为true表示buffer里有数值,如果bFull为false表示没有数值。buffer中的对象有两个属性,在多线程中如果不处理同步的话,可能出现属性不对应的情况。
wait:告诉当前线程放弃监视器并进入睡眠状态,直到其他线程进入同一监视器并调用notify为止。
notify:唤醒同一对象监视器中调用wait的第一线程。用于类似饭馆有一个空位子后通知所有等候就餐的顾客中的第一位可以入座的情况。
notifyAll:唤醒同一对象监视器中调用wait的所有线程,具有最高优先级的线程首先被唤醒并执行。用于类似某个不定期的培训班终于招生满额后,通知所有学员都来上课的情况。
从上面明显可以看出wait、notify和notifyAll只能在synchronized方法中调用,记住一个对象的notify只能够唤醒被同一个对象wait的线程。
1,线程不同步
class ThreadDemo { public static void main(String[] args) { Buffer buf = new Buffer(); new Producer(buf).start(); new Consumer(buf).start(); } } class Producer extends Thread { private Buffer buf; public Producer(Buffer buf) { this.buf = buf; } public void run() { boolean odd = false; while(true) { if(odd) { buf.name="jack"; try{Thread.sleep(1000);}catch(Exception e) {} buf.sex="female"; } else { buf.name="lucy"; try{Thread.sleep(1000);}catch(Exception e) {} buf.sex="male"; } odd = !odd; } } } class Consumer extends Thread { private Buffer buf; public Consumer(Buffer buf) { this.buf = buf; } public void run() { while(true) { try{Thread.sleep(1000);}catch(Exception e) {} System.out.println(buf.name + " : " + buf.sex); } } } class Buffer { boolean bFull; String name = "Unkown"; String sex = "Unkown"; }
结果 写道
jack : male
jack : female
lucy : female
lucy : female
jack : male
lucy : female
jack : male
jack : female
lucy : female
lucy : female
jack : male
lucy : female
jack : male
线程不同步回去出现jack : male,lucy : female 这些错误的输出。
2,线程同步
class ThreadDemo { public static void main(String[] args) { Buffer buf = new Buffer(); new Producer(buf).start(); new Consumer(buf).start(); } } class Producer extends Thread { private Buffer buf; public Producer(Buffer buf) { this.buf = buf; } public void run() { boolean odd = false; while(true) { synchronized(buf) { if(odd) { buf.name="jack"; try{Thread.sleep(100);}catch(Exception e) {} buf.sex="female"; } else { buf.name="lucy"; try{Thread.sleep(100);}catch(Exception e) {} buf.sex="male"; } } odd = !odd; } } } class Consumer extends Thread { private Buffer buf; public Consumer(Buffer buf) { this.buf = buf; } public void run() { while(true) { synchronized(buf) { try{Thread.sleep(100);}catch(Exception e) {} System.out.println(buf.name + " : " + buf.sex); } } } } class Buffer { boolean bFull; String name = "Unkown"; String sex = "Unkown"; }
结果 写道
Unkown : Unkown
lucy : male
jack : female
lucy : male
jack : female
lucy : male
lucy : male
jack : female
lucy : male
jack : female
lucy : male
没有采用线程通信会出现Unkown : Unkown 和连续输出lucy和jack的情况。
3,线程通信 wait notify
class ThreadDemo { public static void main(String[] args) { Buffer buf = new Buffer(); new Producer(buf).start(); new Consumer(buf).start(); } } class Producer extends Thread { private Buffer buf; public Producer(Buffer buf) { this.buf = buf; } public void run() { boolean odd = false; while(true) { synchronized(buf) { if(buf.bFull) try{buf.wait();}catch(Exception e) {} if(odd) { buf.name="jack"; try{Thread.sleep(100);}catch(Exception e) {} buf.sex="female"; } else { buf.name="lucy"; try{Thread.sleep(100);}catch(Exception e) {} buf.sex="male"; } buf.bFull = true; buf.notify(); } odd = !odd; } } } class Consumer extends Thread { private Buffer buf; public Consumer(Buffer buf) { this.buf = buf; } public void run() { while(true) { synchronized(buf) { if(!buf.bFull) try{buf.wait();}catch(Exception e) {} //try{Thread.sleep(100);}catch(Exception e) {} System.out.println(buf.name + " : " + buf.sex); buf.bFull = false; buf.notify(); } } } } class Buffer { boolean bFull = false; String name = "Unkown"; String sex = "Unkown"; }
结果 写道
lucy : male
jack : female
lucy : male
jack : female
lucy : male
jack : female
jack : female
lucy : male
jack : female
lucy : male
jack : female
结果达到了预期的目的。
4,面前对象 同步函数
class ThreadDemo { public static void main(String[] args) { Buffer buf = new Buffer(); new Producer(buf).start(); new Consumer(buf).start(); } } class Producer extends Thread { private Buffer buf; public Producer(Buffer buf) { this.buf = buf; } public void run() { boolean odd = false; while(true) { if(odd) { buf.put("jack","female"); } else { buf.put("lucy","male"); } odd = !odd; } } } class Consumer extends Thread { private Buffer buf; public Consumer(Buffer buf) { this.buf = buf; } public void run() { while(true) { buf.get(); } } } class Buffer { private boolean bFull = false; private String name = "Unkown"; private String sex = "Unkown"; public synchronized void put(String name, String sex) { if(bFull) try{wait();}catch(Exception e) {} this.name = name; this.sex = sex; bFull = true; notify(); } public synchronized void get() { if(!bFull) try{wait();}catch(Exception e) {} System.out.println(name + " : " + sex); bFull = false; notify(); } }
发表评论
-
多线程的Wait返回它等待的下方
2014-08-15 14:16 553多线程的Wait返回它等待的下方。 Java Code ... -
多线程构造函数
2014-04-04 11:50 2087http://hi.baidu.com/tengxiaofe ... -
关于volatile
2013-01-28 13:24 606Volatile修饰的成员变量在每次被线程访问时,都强迫从共享 ... -
Java 多线程例子10 线程之间通信 wait notify notifyAll
2010-07-26 11:24 1313回答问题:http://www.iteye.com/probl ... -
java Thread 停止 开始 暂停
2010-07-23 15:07 241661,写了一个小程序: public class TestTh ... -
【转载】java Timer TimerTask
2010-07-22 11:31 18171,Timer Timer的实质上就是一个多线程,从它的类中 ... -
【转载】DelayQueue 的使用
2010-07-20 20:15 1335原文:http://ideasforjava.iteye.co ... -
多线程 CyclicBarrier
2010-07-20 19:38 963原文:http://blog.csdn.net/qian_34 ... -
java多线程 Semaphore CountDownLatch ScheduledExecutorService
2010-07-20 17:06 1839参考:http://www.ibm.com/developer ... -
java多线程 BlockingQueue 和 SynchronousQueues
2010-07-20 15:30 1459参考:http://www.ibm.com/developer ... -
利用多核CPU计算大的列表中的整数和 CyclicBarrier CountDownLatch ExecutorService
2010-07-20 14:12 1309原文:http://flysnow.iteye.c ... -
JDK 7 中的 Fork/Join 模式
2010-07-20 10:59 1878参考1:http://www.ibm.com/develope ... -
Java 多线程例子10 控制线程的生命 stop
2010-07-19 21:13 1305在Thread类中stop已经不推荐大家使用了,因为使用sto ... -
Java 多线程例子8 线程状态
2010-07-19 17:27 1230原文:http://shihaiyang.iteye.com/ ... -
Java 多线程例子7 线程安全 死锁
2010-07-19 17:07 1517死锁:在多个线程里对多个同步对象具有循环依赖时常会出现死锁。最 ... -
Java 多线程例子6 线程安全 线程同步 同步代码块 同步函数
2010-07-18 18:06 2303线程安全 出现线程安 ... -
Java 多线程例子5 实际例子的讨论
2010-07-18 15:18 10181,网络聊天程序,如QQ。 发送信息和接受信息肯定要连个线程 ... -
Java 多线程例子4 继承Thread 实现Runnable
2010-07-16 19:48 17151,Runnable例子 class ThreadDemo ... -
Java 多线程例子3 联合线程 join()
2010-07-16 17:57 22671,联合线程实际上就是 ... -
Java 多线程例子2 前台线程(用户线程) 后台线程(守护线程 ) setDaemon
2010-07-16 15:16 28801,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编程中至关重要的一部分,它允许程序同时执行多个任务,提升应用程序的效率和响应性。以下是对各个知识点的详细说明: 9.1 Java中的线程: Java程序中的线程是在操作系统级别的线程基础上进行...
Java中多线程编程中,wait、notify、notifyAll三个方法是非常重要的,它们都是Object对象的方法,用于线程之间的通信。下面我们将详细介绍这三个方法的使用和作用。 一、wait()方法 wait()方法是使当前线程自动...
《汪文君JAVA多线程编程实战》是一本专注于Java多线程编程的实战教程,由知名讲师汪文君倾力打造。这本书旨在帮助Java开发者深入理解和熟练掌握多线程编程技术,提升软件开发的效率和质量。在Java平台中,多线程是...
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类的一个方法,用于让当前线程...
本文将深入探讨Java多线程中的关键知识点,包括创建线程、主线程、线程优先级、线程组、线程同步以及线程间的通信。 1. **创建线程** 在Java中,可以通过两种方式创建线程:继承`Thread`类或实现`Runnable`接口。...
2. wait()、notify()和notifyAll():这些方法在Object类中定义,用于线程间的通信和协作。它们必须在同步环境中使用,以避免死锁。 3. Lock接口和ReentrantLock类:Java 5引入了Lock接口,提供了比synchronized更细...
标签“多线程”强调了Java并发编程的核心概念,如线程的创建、同步、通信和状态管理。例如,`synchronized`关键字用于确保对共享资源的互斥访问,防止数据竞争;`wait()`, `notify()`和`notifyAll()`方法用于线程间...
Java提供了wait(), notify()和notifyAll()方法,这些方法用于在线程间交换信息,但必须在同步块中使用,以防止死锁和其他并发问题。此外,还有java.util.concurrent工具包,包含如BlockingQueue等高级并发结构,它们...