- 浏览: 311127 次
- 性别:
- 来自: 武汉
最新评论
-
r463579217:
给一下代码demo呀
Java多线程总结之聊一聊Queue -
水土第一:
LZ 中间文章里面可能有单词拼写错误,小弟补一下。。。
pa ...
Java多线程总结之由synchronized说开去 -
xy_z487:
>> 回调函数:A调用B,同时传A给B。B执行完会 ...
深入浅出Java回调机制 -
xuxiaoyinliu:
THANKS 第一次遇到这种错误,原来是这样
String的valueOf方法传入null -
sinat_25176913:
赞赞赞,一直还在想为什么得到的是一个"null&qu ...
String的valueOf方法传入null
package sure; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Test { private static Logger log = LoggerFactory.getLogger(Test.class); public static void main(String[] args) throws Exception { final Object lock=""; Thread t1=new Thread(){ public void run(){ try { log.info("t1 wait begin"); synchronized (lock) { log.info("t1 get lock, wait begin"); lock.wait(); log.info("t1 wait end,release lock"); lock.notifyAll(); } log.info("t1 wait end"); } catch (InterruptedException e) { e.printStackTrace(); } } }; t1.start(); log.info("t1 start and sleep"); for(int i=0;i<10000001;i++){ if(i==10000000) log.info("i end"); } Thread.sleep(5000); log.info("sleep(5000) end"); log.info("main lock begin"); synchronized (lock) { log.info("main get lock"); lock.notify(); log.info("notify"); Thread.sleep(10000); log.info("sleep 10000 end"); log.info("main wait begin "); lock.wait(); log.info("main wait end"); } log.info("main lock end"); } }
日志信息如下:
2011-11-09 15:44:05,968 INFO [sure.Test] - t1 start and sleep 2011-11-09 15:44:05,968 INFO [sure.Test] - t1 wait begin 2011-11-09 15:44:05,968 INFO [sure.Test] - t1 get lock, wait begin 2011-11-09 15:44:05,984 INFO [sure.Test] - i end 2011-11-09 15:44:10,984 INFO [sure.Test] - sleep(5000) end 2011-11-09 15:44:10,984 INFO [sure.Test] - main lock begin 2011-11-09 15:44:10,984 INFO [sure.Test] - main get lock 2011-11-09 15:44:10,984 INFO [sure.Test] - notify 2011-11-09 15:44:20,984 INFO [sure.Test] - sleep 10000 end 2011-11-09 15:44:20,984 INFO [sure.Test] - main wait begin 2011-11-09 15:44:20,984 INFO [sure.Test] - t1 wait end,release lock 2011-11-09 15:44:20,984 INFO [sure.Test] - t1 wait end 2011-11-09 15:44:20,984 INFO [sure.Test] - main wait end 2011-11-09 15:44:20,984 INFO [sure.Test] - main lock end
wait,notify,notifyAll必须在当前线程获得监视器时才能调用,即这些方法必须在同步块中才能调用。
被阻塞的线程在被notify之后,并不是马上可以执行,而是“可执行”,要到获得锁之后才能真正开始执行。
从这个例子进行各种修改可以用来加深对线程的理解。
package sure; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Test { private static Logger log = LoggerFactory.getLogger(Test.class); public static void main(String[] args) throws Exception { final Object lock=""; Thread t1=new Thread(){ public void run(){ try { log.info("t1 wait begin"); synchronized (lock) { log.info("t1 get lock, wait begin"); Thread.sleep(5000); log.info("sleep end"); lock.wait(); log.info("t1 wait end,release lock"); lock.notifyAll(); } Thread.sleep(5000); log.info("t1 wait end"); } catch (InterruptedException e) { e.printStackTrace(); } } }; t1.start(); log.info("t1 start and sleep"); log.info("main lock begin"); synchronized (lock) { log.info("main get lock"); lock.notify(); log.info("notify"); Thread.sleep(10000); log.info("sleep 10000 end"); log.info("main wait begin "); lock.wait(); log.info("main wait end"); } log.info("main lock end"); } }
日志为:
2011-11-09 16:55:19,031 INFO [sure.Test] - t1 start and sleep 2011-11-09 16:55:19,031 INFO [sure.Test] - main lock begin 2011-11-09 16:55:19,031 INFO [sure.Test] - main get lock 2011-11-09 16:55:19,031 INFO [sure.Test] - notify 2011-11-09 16:55:19,031 INFO [sure.Test] - t1 wait begin 2011-11-09 16:55:29,031 INFO [sure.Test] - sleep 10000 end 2011-11-09 16:55:29,031 INFO [sure.Test] - main wait begin 2011-11-09 16:55:29,031 INFO [sure.Test] - t1 get lock, wait begin 2011-11-09 16:55:34,031 INFO [sure.Test] - sleep end
然后两个线程都会被阻塞,造成死锁。
这个例子进一步说明了同步的用法,另外也表明了Thread.sleep是针对当前运行线程的。
有趣的是,同样是这个代码,在另一种情况下会出现这种情况:
2011-11-09 22:06:05,930 INFO [sure.Test] - t1 start and sleep 2011-11-09 22:06:05,930 INFO [sure.Test] - t1 wait begin 2011-11-09 22:06:05,930 INFO [sure.Test] - main lock begin 2011-11-09 22:06:05,930 INFO [sure.Test] - t1 get lock, wait begin 2011-11-09 22:06:10,930 INFO [sure.Test] - sleep end 2011-11-09 22:06:10,930 INFO [sure.Test] - main get lock 2011-11-09 22:06:10,930 INFO [sure.Test] - notify 2011-11-09 22:06:20,930 INFO [sure.Test] - sleep 10000 end 2011-11-09 22:06:20,930 INFO [sure.Test] - main wait begin 2011-11-09 22:06:20,930 INFO [sure.Test] - t1 wait end,release lock 2011-11-09 22:06:20,930 INFO [sure.Test] - main wait end 2011-11-09 22:06:20,930 INFO [sure.Test] - main lock end 2011-11-09 22:06:25,930 INFO [sure.Test] - t1 wait end
这种情况不会造成死锁阻塞。
由于这两个线程都谁都可能先进入同步块中,所以就造成了两个截然不同的情况。但是上面第一种情况就肯定是子进程先进入同步块,因为main进程用sleep拖延了。
发表评论
-
关于继承的例子
2011-11-19 15:13 1282继承是再普通不过的概念,但是你真的能玩的转吗? 父类Perso ... -
Object类分析equals、hashcode、clone
2011-11-17 21:57 1900Object类中的equals: publ ... -
成员变量的初始化
2011-11-16 16:15 1124Java会对成员变量进行自动初始化,并且在构造方法执行之前完成 ... -
关于java多线程的一篇不错的入门级文章
2011-11-14 22:42 2029虽然都是老生常谈,而且入门级,但是讲的很不错。 一、理解多线 ... -
多线程常用方法比较汇总
2011-11-15 23:07 1638从操作系统的角度讲,o ... -
多线程例子:yield
2011-11-14 20:59 1653public class Test { public ... -
String的valueOf方法传入null
2011-11-12 20:42 13937这个问题很有意思 Object obj = null; ... -
多线程例子:join
2011-11-09 23:06 1411package sure; import java. ... -
JAVA编程经验汇总
2011-11-04 21:04 1292都是一些小的点,不完 ... -
以ConcurrentHashMap为例小议并发集合类
2011-08-09 22:15 5162为了引出并发集合类ConcurrentHashMap,有必要先 ... -
聊一下Java代理那点事
2011-08-06 20:08 2098代理模式 代理模式的作用是:为其他对象提供一种代理以控制对 ... -
说说volatile关键字
2011-08-05 16:29 2395Java语言规范中指出:为 ... -
小议时序调度Timer和Quartz
2011-07-28 21:15 7269本文不是用来讲授入门手把手ABC小例子的,算是自己这段时间对T ... -
关于Java包装类装箱拆箱的小例子
2011-07-27 09:50 1551简单来说:装箱就是把值类型转变为引用类型,拆箱就是把引用类型转 ... -
深入浅出Java回调机制
2011-07-21 21:24 83491前几天看了一下Spring的部分源码,发现回调机制被大量使用, ... -
Java多线程总结之聊一聊Queue
2011-07-17 23:13 36980上个星期总结了一下synchronized相关的知识,这次将Q ... -
Java多线程总结之由synchronized说开去
2011-07-10 17:19 22643更新完毕,结贴,以后有新的想法再开新帖 这几天不断添加新内容, ... -
关于递归
2011-06-18 21:27 109算法中有调用自身,则是递归 递归算法必须是逐步有规律简化的, ... -
java的内部类与匿名类
2011-06-18 13:19 1901提起Java内部类(Inner Class)可能很多人不太熟悉 ... -
Java线程同步机制synchronized关键字的理解
2011-06-18 08:49 37由于同一进程的多个线 ...
相关推荐
在Java编程语言中,多线程是...总之,理解和熟练掌握`wait()`, `notify()`以及`sleep()`的使用对于编写高效的多线程程序至关重要。在设计并发程序时,应根据需求选择合适的方法,确保线程间的协同工作和程序的正确性。
总结来说,Java的 `wait()` 和 `notify()` 提供了一种在多线程环境中控制线程执行的机制。通过合理使用这些方法,我们可以实现线程间的协作,精确控制子线程的运行状态。然而,这种方式虽然灵活,但管理起来相对复杂...
在Java多线程编程中,wait和notify是两个非常重要的方法,它们都是Object类的方法,用于线程之间的通信和同步。下面我们将详细解释wait和notify的用法。 wait方法 wait方法是Object类的一个方法,用于让当前线程...
本文旨在解析一个具体的Java多线程示例代码,以帮助读者更好地理解`wait()`与`notify()`方法的作用及其实现机制。这两个方法是Java中实现线程间通信的重要手段之一,尤其在解决生产者消费者模型、读者写者问题等经典...
public class ThreadWaitNotify { public static void main(String[] args) throws InterruptedException { DemoTest demoTest = new DemoTest(); // 使用线程池异步执行waitTest方法 ExecutorService ...
- `wait()` 会抛出 `InterruptedException`,与 `sleep()` 类似,需要妥善处理。 - `notify()` 仅唤醒一个等待该对象的线程,而 `notifyAll()` 唤醒所有等待的线程。 - 在使用这些方法时,必须确保线程已经获得了...
挂起线程通常通过调用`sleep()`或`wait()`方法实现,恢复线程可能通过`notify()`或`notifyAll()`唤醒,终止线程则可以通过`interrupt()`方法发送中断请求,但线程本身需要检查`isInterrupted()`或`...
总之,这个简单的多线程例子展示了创建、启动和停止线程的基本步骤。通过理解和实践这些概念,开发者可以更好地设计和优化多线程应用程序,以满足高并发环境的需求。在深入学习多线程时,还要关注线程安全、性能优化...
"Java多线程通信wait()和notify()代码实例" Java多线程通信是Java编程语言中一个重要的概念,它允许程序同时执行多个线程,以提高程序的效率和响应速度。在Java中,多线程通信主要通过wait()和notify()方法实现,...
了解了多线程的基本概念和应用后,我们来看一下与标签`tthread`相关的知识点。在Java中,`tthread`可能是一个自定义的线程类,它扩展了`Thread`类或实现了`Runnable`接口。自定义线程类可以重写`run()`方法,实现...
标题和描述中并未直接提供关于Java多线程的具体例子,但是从给定的【部分内容】中我们可以提取和概括出多个关于Java多线程编程的知识点。 1. Java多线程基础概念: Java多线程是Java语言支持并发编程的一个重要...
在多线程环境下,可能会出现数据竞争问题,为了解决这个问题,Java提供了多种同步机制,如synchronized关键字、wait/notify机制、Lock锁(ReentrantLock)等。synchronized用于控制对共享资源的访问,而wait/notify...
### Java多媒体与多线程处理实验知识点概览 #### 一、实验目标解析 本次实验旨在深入探索Java中多线程处理与多媒体应用的核心技术,具体目标包括: 1. **理解线程概念**:线程是操作系统能够进行运算调度的最小...
在Java编程语言中,多线程是核心特性之一,它允许程序同时执行多个任务,从而提高了应用程序的效率和响应速度。本示例着重探讨如何在Java中实现和管理多线程,以及它带来的挑战和解决方案。 一、Java多线程基础 1. ...
本文对Java语言的多线程编程进行了详细的讲解,涵盖了Java的线程机制、线程的创建、执行、结束、优先级、状态及状态间的转换、共享访问与线程同步、wait和notify在线程间的交互、Thread类的其他重要方法等方面的内容...
3. **Java多线程例子**:文档中的例子创建了两个线程,`thread1`和`thread2`。`thread1`是通过继承`Thread`类实现的,而`thread2`是通过实现`Runnable`接口并传递给`Thread`构造函数实现的。两者都覆盖了`run()`方法...
本文将深入探讨多线程的概念、创建与使用,以及在实际应用中需要注意的事项。 一、多线程的基本概念 1. 线程:线程是操作系统分配处理器时间的基本单元,一个进程可以包含一个或多个线程。每个线程都有自己独立的...
让我们深入探讨一下这个例子以及与多线程相关的知识点。 首先,创建线程主要有两种方式:继承`Thread`类和实现`Runnable`接口。在这个例子中,选择了第一种方式,即创建了一个名为`ThreadTest`的类,它直接继承自`...
在探究JVM线程状态以及Thread.sleep的实现原理时,我们首先需要了解Java线程与操作系统...理解线程状态以及这些状态之间的转换机制,有助于开发者在设计多线程程序时作出更为合理的决策,以提高程序的性能和可靠性。
10. sleep()和wait()方法:sleep()方法让当前线程暂停指定时间后继续执行,而wait()方法则使线程进入等待状态,直到被notify()或notifyAll()唤醒。 以上只是Java多线程基础知识的一部分,深入学习还包括线程池的...