注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

和申的个人主页

专注于java开发,1985wanggang

 
 
 

日志

 
 

线程中的current thread not owner异常错误  

2010-03-12 00:03:28|  分类: Java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 

org.quartz.impl.jdbcjobstore.LockException: Failure obtaining db row lock: - 和申 - 和申的个人主页

/**
 * 如下面的例子就是会抛出 current thread not owner 异常错误的程序
 */

/**
 *
 */
package threadwait;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author wanggang
 * @version Mar 11, 2010
 */
public class TestThread extends Thread{

 public static AtomicInteger currentThreadCount = new AtomicInteger();
 
 public TestThread() {
  super();
  currentThreadCount.incrementAndGet();
  if(currentThreadCount.get()>10){
   try {
    this.wait();//这个地方有点问题,构造的时候,
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
 }
 public void run(){
  currentThreadCount.decrementAndGet();
  this.notify();
 }
 /**
  * @param args
  */
 public static void main(String[] args) {
  for(;;){
   TestThread tt = new TestThread(); 
   tt.start();
  }
  
 }

 

}



==================================================================

/**
 * 这个例子就是正确的,说明需要访问临界资源时,用wait notifiy 才是正确的
 */
package threadwait;

import java.util.concurrent.atomic.AtomicInteger;

import sun.misc.Lock;

/**
 * @author wanggang
 * @version Mar 11, 2010
 */
public class TestResource {
 public AtomicInteger currentThreadCount = new AtomicInteger();
 private Object lock = new Object();
 public void test(){
  currentThreadCount.incrementAndGet();
  synchronized(currentThreadCount){
   if(currentThreadCount.get() > 10)
   try {
    currentThreadCount.wait();
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
  /*try {
   Thread.sleep(10);
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }*/
  System.out.println("  count:"+currentThreadCount.get());
  synchronized(currentThreadCount){
   currentThreadCount.decrementAndGet();
   currentThreadCount.notifyAll();
  }
  
  System.out.println("end count:"+currentThreadCount.get());
 }
 private static class TestThread extends Thread{
  private TestResource tr;
  
  public TestThread(TestResource tr) {
   
   super();
   this.tr = tr;
   System.out.println("TestThread");
  }

  /* (non-Javadoc)
   * @see java.lang.Thread#run()
   */
  @Override
  public void run() {
   tr.test();
  }
  
 }
 public static void main(String[] args) {
  int count = 0;
  TestResource tr = new TestResource();
  for(;;){
   
   TestThread tt = new TestThread(tr);
   count++;
   System.out.println(count);
   while(tr.currentThreadCount.get()>100){
    
    Thread.yield();
    
   }
   System.out.println(count);
   tt.start();
  }
  
 }
}

===============================================================================

多线程常用的一些方法: wait(),wait(long),notify(),notifyAll()等

这些方法是当前类的实例方法,

wait()      是使持有对象锁的线程释放锁;

wait(long)是使持有对象锁的线程释放锁时间为long(毫秒)后,再次获得锁,wait()和wait(0)等价;

no

tify()    是唤醒一个正在等待该对象锁的线程,如果等待的线程不止一个,那么被唤醒的线程由jvm确定;

notifyAll 是唤醒所有正在等待该对象锁的线程.

并且应该优先使用notifyAll()方法,因为唤醒所有线程比唤醒一个线程更容易让jvm找到最适合被唤醒的线程.

对于上述方法,只有在当前线程中才能使用,否则报运行时错误java.lang.IllegalMonitorStateException: current thread not owner.

从实现角度来分析:

在线程调用wait()方法时,需要把它放到一个同步段里,即应该在调用前使用

1线程中的current thread not owner异常错误 - 和申 - 和申的个人主页线程中的current thread not owner异常错误 - 和申 - 和申的个人主页synchroed(this)线程中的current thread not owner异常错误 - 和申 - 和申的个人主页{

2线程中的current thread not owner异常错误 - 和申 - 和申的个人主页   thread.wait();

3线程中的current thread not owner异常错误 - 和申 - 和申的个人主页  线程中的current thread not owner异常错误 - 和申 - 和申的个人主页线程中的current thread not owner异常错误 - 和申 - 和申的个人主页

4线程中的current thread not owner异常错误 - 和申 - 和申的个人主页}

5线程中的current thread not owner异常错误 - 和申 - 和申的个人主页

否则将会出现"java.lang.IllegalMonitorStateException: current thread not owner"的异常。

org.quartz.impl.jdbcjobstore.LockException: Failure obtaining db row lock: - 和申 - 和申的个人主页

转自 : http://www.blogjava.net/crazycy/archive/2006/10/08/73896.html

  评论这张
 
阅读(2796)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016