`
wpskl
  • 浏览: 2471 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

搞不懂的 java 线程问题

阅读更多
代码不是太长,就是下面这段代码,首先看一下,凭感觉回答有没有问题,然后运行一下。



public class Test {
public synchronized void t(){
new Thread(new Fuzhu()).start();
}
public static void main(String[] args) {
new Test().t();
}
}

class Fuzhu implements Runnable{
public void run() {
            try {
this.wait(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}


运行之后,有谁能回答一下,为什么回报 java.lang.IllegalMonitorStateException: current thread not owner 这个异常.
1
2
分享到:
评论
12 楼 totti_1587 2011-10-01  
this.wait(1000);
这里的this指的是Fuzhu 的对象,要在某个对象上wait必需先获取这个对象锁,你都没有获取Fuzhu 的对象锁,当然不能在Fuzhu 上wait了
11 楼 samttsch 2011-09-15  
wpskl 写道
我还有个问题:
    就是如何定时释放一个已经加了synchronized 的方法(比如这个方法执行的时间很长,影响后面的处理,我想如果这个方法执行了多长时间还没有执行完毕,就让它释放这个锁),这该怎么做呢?


锁获取了,就必须要释放,其他线程才能执行

如果一个方法执行时间太长,可以分成几个段或几个方法来执行
synchronized (object)
{

}

public synchronized void t(){
}
这个形式等于
public void t(){

  synchronized(this)
  {

  }

}
10 楼 OpenMind 2011-09-14  
   怎么这种文章也到首页来了?小编能否过滤一下
9 楼 wpskl 2011-09-14  
我还有个问题:
    就是如何定时释放一个已经加了synchronized 的方法(比如这个方法执行的时间很长,影响后面的处理,我想如果这个方法执行了多长时间还没有执行完毕,就让它释放这个锁),这该怎么做呢?
8 楼 wpskl 2011-09-14  
samttsch 写道
main是主程序是一个线程
Fuzhu 也是一个线程

执行:new Test().t();
到这里时,main线程创建一个Test()对象,调用t()方法,由于t是synchronized的
所以main线程获得Test()对象的锁

t()方法:
启动Fuzhu线程,执行run方法
调用this.wait(1000);
wait()方法表示暂停一段时间,并释放这个Fuzhu的锁,而此时并没有获得锁,
所以报IllegalMonitorStateException

LZ的主要问题是:
this表示的是Fuzhu的实例,wait是想要释放Fuzhu对象的锁
而你main方法中同步的是Test实例,这两个不是同一个

谢谢你的回答!
7 楼 wpskl 2011-09-14  
dsr_22 写道
run 前面加个 synchronized 就可以了
wait会释放对象锁, 你没锁他如何释放。

谢谢你的回答!

我还有个问题:
    就是如何释放一个已经加了synchronized 的方法(比如这个方法执行的时间很长,影响后面的处理,我想如果这个方法执行了多长时间还没有执行完毕,就让它释放这个锁),这该怎么做呢?
 
6 楼 samttsch 2011-09-14  
main是主程序是一个线程
Fuzhu 也是一个线程

执行:new Test().t();
到这里时,main线程创建一个Test()对象,调用t()方法,由于t是synchronized的
所以main线程获得Test()对象的锁

t()方法:
启动Fuzhu线程,执行run方法
调用this.wait(1000);
wait()方法表示暂停一段时间,并释放这个Fuzhu的锁,而此时并没有获得锁,
所以报IllegalMonitorStateException

LZ的主要问题是:
this表示的是Fuzhu的实例,wait是想要释放Fuzhu对象的锁
而你main方法中同步的是Test实例,这两个不是同一个
5 楼 dsr_22 2011-09-14  
run 前面加个 synchronized 就可以了
wait会释放对象锁, 你没锁他如何释放。
4 楼 wpskl 2011-09-14  
mythy52 写道
wpskl 写道
mythy52 写道
this.wait(1000);
要放在synchronized块中

为什么要放在synchronized块中,现在的this难道不是Fuzhu这个对象吗?能详细说一下吗?谢谢!


一个线程获取某个对象的锁之后才能调用该对象的wait方法

按您的意思是说Fuzhu这个类中的this是指Test对象?那也想不通啊。你说的“一个线程获取某个对象的锁之后才能调用该对象的wait方法”这句话我知道什么意思,但是用在上面,就感觉解释不通了,麻烦你先讲一下,现在Fuzhu对象中的this是指什么?(我理解比较慢,请见谅)
3 楼 mythy52 2011-09-14  
wpskl 写道
mythy52 写道
this.wait(1000);
要放在synchronized块中

为什么要放在synchronized块中,现在的this难道不是Fuzhu这个对象吗?能详细说一下吗?谢谢!


一个线程获取某个对象的锁之后才能调用该对象的wait方法
2 楼 wpskl 2011-09-14  
mythy52 写道
this.wait(1000);
要放在synchronized块中

为什么要放在synchronized块中,现在的this难道不是Fuzhu这个对象吗?能详细说一下吗?谢谢!
1 楼 mythy52 2011-09-14  
this.wait(1000);
要放在synchronized块中

相关推荐

    java线程学习教程

    本教程不仅提供了对Java线程基础概念的全面介绍,还深入探讨了如何有效地利用线程来解决实际问题。通过学习这些知识点,开发者可以更好地理解和应用多线程编程技巧,从而编写出高性能、高可靠性的Java应用程序。

    Java搞懂的六个问题.txt

    ### Java搞懂的六个问题 在深入探讨Java中的一些关键概念之前,我们先来了解这份文档的背景。文档名为“Java搞懂的六个问题.txt”,但文档内容并未明确列出六个具体的问题,而是围绕着几个核心Java知识点进行了阐述...

    每个JAVA初学者都应该搞懂的问题!

    ### 每个JAVA初学者都应该搞懂的问题详解 #### 问题一:我声明了什么! 在Java中,当我们执行 `String s = "HelloWorld!";` 这样的语句时,实际上是在做两件事情:一是声明了一个类型为String的引用变量`s`,二是...

    java你必须搞懂的问题

    ### Java你必须搞懂的问题 #### 问题一:我声明了什么! 在Java中,当你看到这样的代码: ```java String s = "Hello world!"; ``` 实际上,这行代码并没有直接创建一个新的`String`对象,而是声明了一个名为`s`...

    java初学者都应该搞懂的六个问题.doc

    Java初学者在学习过程中经常会遇到一些关键的概念性问题,这些理解和掌握程度直接影响到编程技能的提升。以下就是针对文档中提到的六个问题的详细解答: 问题一:关于String类型的声明 在Java中,当我们声明一个...

    一篇文章弄懂Java多线程基础和Java内存模型

    Java多线程是并发编程的重要组成部分,理解和掌握其基础以及Java内存模型对于任何Java开发者来说都是必不可少的。本文将深入探讨这两个主题。 首先,我们来理解多线程的生命周期及其五种基本状态: 1. 新建状态...

    每个JAVA初学者都应该搞懂的问题.rar

    这个名为“每个JAVA初学者都应该搞懂的问题”的压缩包文件,显然是为那些刚开始学习Java的人准备的一份详细教程。让我们来探讨一下其中可能包含的知识点。 首先,我们看到一个名为“每个JAVA初学者都应该搞懂的问题...

    IO和Java多线程的应用.zip

    IO和Java多线程的应用.zip IO和Java多线程的应用.zip IO和Java多线程的应用.zip IO和Java多线程的应用.zip IO和Java多线程的应用.zip

    Java初学者都应该搞懂的六个问题.pdf

    Java初学者在学习过程中经常会遇到一些关键概念的理解难题,这里我们将深入探讨六个核心问题,以帮助初学者更好地理解和掌握Java编程。 首先,我们要明白的是**Java中的对象引用**。在Java中,当我们声明一个对象,...

    Java 面经手册·小傅哥.pdf

    这是一本以面试题为入口讲解 Java 核心内容的技术书籍,书中内容极力的向你证实代码是对数学...2. 想阅读 Java 核心源码,但总感觉看不懂的 3. 看了太多理论,但没有实践验证的 4. 求职面试,总被面试题搞的死去活来的

    每个JAVA工作者都应该搞懂的问题

    作为一个Java开发者,了解语言的基础至关重要,这不仅能够提升编程效率,还能避免在实际工作中遇到诸多问题。以下是一些每个Java工作者都应该深入理解的关键知识点: 1. **对象与引用的理解**: 在Java中,对象是...

    Java精华积累每个初学者都应该搞懂的问题.txt

    ### Java精华积累每个初学者都应该搞懂的问题 在学习Java的过程中,有许多基础知识是每位初学者都需要掌握的。本文将从给定的文件标题、描述、标签以及部分内容中提炼出几个重要的知识点进行详细解读,帮助大家更好...

    每个学Java的人都应该搞懂的问题

    ### 每个学Java的人都应该搞懂的问题 在学习Java的过程中,会遇到许多经典问题,这些问题不仅是初学者常犯的错误来源,也是深入理解Java语言特性的重要途径。本文将针对给定文件中的几个核心问题进行详细解析,帮助...

    搞懂Java线程池

    搞懂Java线程池 Java线程池是Java编程中非常重要的知识点,多线程并发算是Java进阶的知识,用好多线程不容易有太多的坑。在Java中,创建线程是一个“重”操作,需要调用操作系统内核API,然后操作系统再为线程分配...

    每个学Java的人都应该搞懂

    ### 每个学Java的人都应该搞懂的关键概念 在Java编程的学习旅程中,有若干核心概念是每位学习者必须掌握的。本文将基于提供的部分信息深入解析这些关键知识点,帮助初学者更好地理解并运用Java。 #### Java中的...

Global site tag (gtag.js) - Google Analytics