同步的疑惑 The method notify() can only be called from within a synchronized method. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 schwarzenegger(找不到服务器) you mistaked,I think.It can be called in synchronized method or synchronized block. 好像你同步的对象有问题,把synchronized(lock)改成synchronized(this)肯定就没有问题了. xiaohaiz(老土进城,两眼通红) ( ):改掉之后,的确运行成功了。能告诉我什么原因么? 这样也行public void run(){ String ThreadName = Thread.currentThread().getName(); if(ThreadName.equals("first")){ try { synchronized(lock){ lock.wait(); for(int i = 0;i < 10;i ++){ System.out.println("first executed"); } } } catch (Exception ex) { } }else{ synchronized(lock){ for(int i = 0;i < 10;i ++){ System.out.println("second executed"); } lock.notify(); } } 这样还行 synchronized public void run(){ String ThreadName = Thread.currentThread().getName(); if(ThreadName.equals("first")){ try { { wait(); for(int i = 0;i < 10;i ++){ System.out.println("first executed"); } } } catch (Exception ex) { } }else{ { for(int i = 0;i < 10;i ++){ System.out.println("second executed"); } notify(); } } sorry,没有看到楼主的回复。你把概念弄混绕了。对一个对象调用wait和notify方法必须要获得这个对象的锁。你原来的代码实际上同步在lock对象上,却wait在ThreadTest对象上。所以有两种修改方式:(1) 我刚才告诉你的方式,同步在ThreadTest对象上 synchronized(this);(2) 还是同步在lock上,调用lock对象的wait和notify方法,就像楼上的给你的解决一样: lock.wait();lock.notify();再重申一次:对一个对象调用wait和notify方法必须要获得这个对象的锁。你把两个对象混在一起了。 why? 因为线程在对wait() 和 notify() 调用时, 必须先要求取得object的锁占有状态 to kasanghyh (流浪的小狗) :看看,freelybird(阿愚) 和俺的意见都一致,问题也解决了,道理也说明白了。结帖吧。 :) 不好意思。如果以this作为锁的对象的话,我想问一下,创建两个线程时,使用的是相同的ThreadTest引用么? 为什么? 看看你的这两句:new Thread(this,"first").start();new Thread(this,"second").start();可不是都是一个this吗。:) 为什么改成这样就不行了呢?package test;public class ThreadTest implements Runnable{ public ThreadTest(){ } public void run(){ String ThreadName = Thread.currentThread().getName(); if(ThreadName.equalsIgnoreCase("first")){ try { synchronized(this){ wait(); for(int i = 0;i < 10;i ++){ System.out.println("first executed"); } } } catch (Exception ex) { } }else{ synchronized(this){ for(int i = 0;i < 10;i ++){ System.out.println("second executed"); } notifyAll(); } } } public static void main(String[] args){ new Thread(new ThreadTest(),"first").start(); new Thread(new ThreadTest(),"second").start(); }} 再看看,这里:new Thread(new ThreadTest(),"first").start();new Thread(new ThreadTest(),"second").start();改了之后是两个new,是两个不同的对象了。 谢谢,我彻底明白了,谢谢大家,谢谢 xiaohaiz(老土进城,两眼通红),谢谢 freelybird(阿愚) java包的引入怎么不行? 关于异常的问题请教 (求助)关于j2me二维字符串数组的问题? java数据类型问题 请指点一下:我刚决定要转向JAVA,哪位前辈指点一下我从哪开始学 在不知道表结构的前提下,怎样把该表的一条记录打印出来?(即不知道各字段类型时,用哪个方法?) 怎么样程序实现?(如果分不够,还可以加) 数据库问题(大家快来帮把手,实在不行,我可以再放100分) JAVA的菜单事件一定给分 session 如何在命令提示符下执行java程序 有关constructor顺序的问题
It can be called in synchronized method or synchronized block.
改掉之后,的确运行成功了。
能告诉我什么原因么?
public void run(){
String ThreadName = Thread.currentThread().getName();
if(ThreadName.equals("first")){
try {
synchronized(lock){
lock.wait();
for(int i = 0;i < 10;i ++){
System.out.println("first executed");
}
}
}
catch (Exception ex) { }
}else{
synchronized(lock){
for(int i = 0;i < 10;i ++){
System.out.println("second executed");
}
lock.notify();
}
}
synchronized public void run(){
String ThreadName = Thread.currentThread().getName();
if(ThreadName.equals("first")){
try {
{
wait();
for(int i = 0;i < 10;i ++){
System.out.println("first executed");
}
}
}
catch (Exception ex) { }
}else{
{
for(int i = 0;i < 10;i ++){
System.out.println("second executed");
}
notify();
}
}
你把概念弄混绕了。
对一个对象调用wait和notify方法必须要获得这个对象的锁。
你原来的代码实际上同步在lock对象上,却wait在ThreadTest对象上。
所以有两种修改方式:
(1) 我刚才告诉你的方式,同步在ThreadTest对象上 synchronized(this);
(2) 还是同步在lock上,调用lock对象的wait和notify方法,就像楼上的给你的解决一样:
lock.wait();lock.notify();再重申一次:对一个对象调用wait和notify方法必须要获得这个对象的锁。
你把两个对象混在一起了。
看看,freelybird(阿愚) 和俺的意见都一致,问题也解决了,道理也说明白了。
结帖吧。 :)
new Thread(this,"first").start();
new Thread(this,"second").start();
可不是都是一个this吗。:)
package test;public class ThreadTest implements Runnable{ public ThreadTest(){ }
public void run(){
String ThreadName = Thread.currentThread().getName();
if(ThreadName.equalsIgnoreCase("first")){
try {
synchronized(this){
wait();
for(int i = 0;i < 10;i ++){
System.out.println("first executed");
}
}
}
catch (Exception ex) { }
}else{
synchronized(this){
for(int i = 0;i < 10;i ++){
System.out.println("second executed");
}
notifyAll();
}
} }
public static void main(String[] args){
new Thread(new ThreadTest(),"first").start();
new Thread(new ThreadTest(),"second").start();
}}
new Thread(new ThreadTest(),"first").start();
new Thread(new ThreadTest(),"second").start();
改了之后是两个new,是两个不同的对象了。