本人是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();
}
}
}
}
}
下面的就可以了!不是一样的么?这是为什么样,请高人帮帮忙! 展开
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();
}
}
}
}
}
下面的就可以了!不是一样的么?这是为什么样,请高人帮帮忙! 展开
展开全部
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();
一样可以的
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();
一样可以的
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询