大家。我在java中编写了一个同步代码。有2个类,第一个将数字增加1000,第二个增加相同的数字10.该过程应重复100次。 虽然我已经编写了循环周期但它们不起作用。
以下是代码:
public class thread
{
static int count = 100;
public static void main(String[] args)
{
Thread thread1 = new Thread(new XThread());
Thread thread2 = new Thread(new YThread());
thread1.start();
thread2.start();
synchronized(thread2)
{
thread2.notify();
}
}
}
class XThread extends Thread {
static long sum=0;
static int i;
synchronized public void run() {
sum=5+1000;
System.out.println(i+" "+"Thread 1"+" "+sum);
{
for(i= 0; i < lab5.count; i++)
{
try {
{
System.out.println("-----------");
this.wait();
}
}
catch (InterruptedException ex)
{
sum=sum+1000;
System.out.println(i+" "+"Thread 1"+" "+sum);
notify();
}
}
}
}
}
class YThread extends Thread
{
static long sum;
static int i;
synchronized public void run()
{
sum=5+10;
System.out.println(YThread.i+" "+"Thread 2"+" "+YThread.sum);
for(i=0; i < lab5.count; i++)
{
try
{
{
System.out.println("------------");
this.wait();
}
}
catch (InterruptedException ex)
{
sum=sum+10;
System.out.println(YThread.i+" "+"Thread 2"+" "+YThread.sum);
notify();
}
}
}
}
答案 0 :(得分:1)
在您的代码中,您在线程覆盖的wait
方法中调用了run
。
不幸的是,没有人在等待的对象上调用notify
方法。
这是因为在您的main
中,您将X
和YThread
重新包装到通用Thread
对象中。
因此,对thread2.notify()
的调用将信号发送到错误的对象(不是被锁定的YThread,而是包装器对象)。
将声明更改为
Thread thread1 = new XThread();
Thread thread2 = new YThread();
你的程序仍然会锁定(因为你的notifying
线程没有足够多次),但至少它可能会更进一步。在我的最后一句中注意may
。这是因为可以在线程调用其第一个notify
之前发送wait
到thread2。