本人是java编程菜鸟:关于多线程的一个问题,希望高人给予帮助;就是连个线程,交替打印两个线程的内容!

比如两个线程分别交替打印t1和t2;这里是我的写的一个实现publicclassThread_Test{privateObjectobj=newObject();priv... 比如两个线程分别交替打印t1和t2;这里是我的写的一个实现
public class Thread_Test {
private Object obj = new Object();
private static int N = 0;
public static void main(String[] args) {
Thread1 th1 = new Thread_Test().new Thread1();
Thread2 th2 = new Thread_Test().new Thread2();
th1.start();
th2.start();
}

class Thread1 extends Thread {//成员内部类
public void run() {
synchronized (obj) {
while (true) {
if(N%2!=0){//1、3、5、7、9... try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("t1");
N++;
obj.notify();
}
}

}
}

class Thread2 extends Thread {//成员内部类
public void run() {
synchronized (obj) {
while (true) {
if(N%2==0){//0、2、4、6、8.....
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("t2");
N++;
obj.notify();
}
}
}
}

}
现在上边的代码只打印出了一个-------->t1 然后就卡在那里了,请问为什么呀?
如果代码稍作改动:
public class Thread_Test {
private Object obj = new Object();
private static int N = 0;
public static void main(String[] args) {
Thread_Test tt = new Thread_Test();
tt.action();
}
public void action(){
Thread1 th1 = new Thread1();
Thread2 th2 = new Thread2();
th1.start();
th2.start();
}

class Thread1 extends Thread {
public void run() {
synchronized (obj) {
while (true) {
if(N%2!=0){
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("t1");
N++;
obj.notify();
}
}

}
}

class Thread2 extends Thread {
public void run() {
synchronized (obj) {
while (true) {
if(N%2==0){
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("t2");
N++;
obj.notify();
}
}
}
}

}
下面的就可以了!不是一样的么?这是为什么样,请高人帮帮忙!
展开
 我来答
cpygogogo
2011-03-29 · 超过43用户采纳过TA的回答
知道答主
回答量:116
采纳率:0%
帮助的人:97.7万
展开全部
Thread1 th1 = new Thread_Test().new Thread1();
Thread2 th2 = new Thread_Test().new Thread2();
这两句你是创建了两个不同的Thread_Test对象,他们都有各自的obj。这等于th1和th2在不同对象上工作,你的锁就没有意义了,th1执行了一次后锁住,th2开始就直接锁住。
记住同步永远是多个线程在一个对象上作用才讨论的问题,这个你肯定也明白,就是对对象创建机制有些不清楚。

Thread1 th1 = new Thread_Test().new Thread1();
Thread2 th2 = new Thread_Test().new Thread2();
th1.start();
th2.start();
这段要改成
Thread_Test tt = new Thread_Test();
Thread1 th1 = tt.new Thread1();
Thread2 th2 = tt.new Thread2();
th1.start();
th2.start();
一样可以的
hulala2000
2011-03-30 · 超过21用户采纳过TA的回答
知道答主
回答量:53
采纳率:0%
帮助的人:19.7万
展开全部
楼上说的对,synchronized (obj)中obj一定要是线程共享的。
private Object obj = new Object();
把obj改成静态的
private static Object obj = new Object();
这样也可以。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式