class firstThread extends Helper1
{
Thread thread_1 = new Thread(new Runnable()
{
@Override
public void run() {
try {
for (int i = 1; i <= 20; i++) {
System.out.println("Hello World");
Thread.sleep(500);
if (i == 10) {
Notify();
Wait();
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
class secondThread extends firstThread
{
Thread thread_2 = new Thread(new Runnable()
{
@Override
public void run() {
// TODO Auto-generated method stub
try {
Wait();
for(int i = 1; i<=20; i++)
{
System.out.println("Welcome");
Thread.sleep(100);
}
Notify();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
class Helper1
{
public synchronized void Wait() throws InterruptedException
{
wait();
}
public synchronized void Notify() throws InterruptedException
{
notify();
}
}
public class InheritanceClass {
public static void main(String[] args)
{
Thread f = new Thread(new firstThread().thread_1);
Thread s = new Thread(new secondThread().thread_2);
f.start();
s.start();
}
}
只有第一个Thread有输出。请试试我的代码。我不知道为什么会这样。 第二个线程没有输出,我想这是因为secondThread中的Wait(),我不知道该怎么做。
答案 0 :(得分:2)
问题在于以下代码:
class Helper1
{
public synchronized void Wait() throws InterruptedException
{
wait();
}
public synchronized void Notify() throws InterruptedException
{
notify();
}
}
以上,wait()
和notify()
来电相当于this.wait()
和this.notify()
。但是,thread1
和thread2
是单独的对象,因此它们不会通过此方法进行通信。
为了进行通信,您需要一个共享锁对象。例如:
Object lock = new Object();
firstThread = new firstThread(lock);
secondThread = new secondThread(lock);
和同步如:
void wait(Object lock) {
synchronized(lock) {
lock.wait();
}
}
void notify(Object lock) {
synchronized(lock) {
lock.notify();
}
}
免责声明:我个人不会这样做,但它确实回答了OP的问题。
答案 1 :(得分:0)
这段代码实在令人困惑,这使得很难看到潜在的问题。
firstThread
)。Wait
和Notify
没有理由synchronized
。secondThread
继承自firstThread
???实际上,你为什么要这两个班?你应该从Helper1
或其他东西创建一个匿名的内部类。无论如何,问题是当你在thread1中调用Notify()
时,它会通知本身,而不是thread2。