gpt4 book ai didi

java - Java中如何通知特定的线程

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:39:56 24 4
gpt4 key购买 nike

如何在线程间通信中调用特定线程?

在下面的程序中,我有两个线程 t1t2

当我调用 t1.notify() 时它引发:

Exception in thread "Thread-1" java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at Shared.methodTwo(NotifyThread.java:43)
at Thread2.run(NotifyThread.java:77)
Error

class Shared {

Thread1 t1 ;
Thread2 t2 ;

void ThreadInit( Thread1 t1 , Thread2 t2 ) {
this.t1 = t1 ;
this.t2 = t2 ;
}

synchronized void methodOne()
{
Thread t = Thread.currentThread();

System.out.println(t.getName()+" is relasing the lock and going to wait");

try
{
wait(); //releases the lock of this object and waits
}
catch (InterruptedException e)
{
e.printStackTrace();
}

System.out.println(t.getName()+" got the object lock back and can continue with it's execution");
}

synchronized void methodTwo()
{
Thread t = Thread.currentThread();

try
{
Thread.sleep(5000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}

t1.notify();

System.out.println("A thread which is waiting for lock of this object is notified by "+t.getName());
}
}

class Thread1 extends Thread
{
Shared s ;
Thread1( Shared s ) {

this.s = s ;
}

public void run()
{
s.methodOne(); //t1 calling methodOne() of 's' object
}

}

class Thread2 extends Thread {
Shared s ;
Thread2( Shared s ) {

this.s = s ;

}

public void run()
{
s.methodTwo(); //t1 calling methodOne() of 's' object
}


}
public class NotifyThread
{
public static void main(String[] args)
{
final Shared s = new Shared();

Thread1 t1 = new Thread1(s) ;
Thread2 t2 = new Thread2(s) ;

s.ThreadInit(t1,t2) ;

t1.start();
t2.start();
}
}

最佳答案

您不/不能通知特定线程。您在锁定对象上调用 notify()。这会唤醒正在等待锁的线程之一1。在您的情况下,锁定对象是一个 Thread ...这很容易混淆图片。但是,请参见下文。

但是您的问题(IllegalMonitorStateException)的发生是因为执行通知的线程(即 当前 线程)没有持有锁。当前线程在通知锁时必须持有锁是一个(硬性)要求。

有关更多详细信息,请阅读 Object.wait(timeout) 的 javadoc 或(例如)此:http://howtodoinjava.com/core-java/multi-threading/how-to-work-with-wait-notify-and-notifyall-in-java/

1 - 如果多个线程正在等待您的锁,调度程序将“随机”选择一个线程。或者,notifyAll 将唤醒所有等待的线程。


我不会将 Thread 对象用作锁定对象。它可能会工作,但也有可能其他东西(可能是运行时系统中的东西)也在锁定/等待/通知 Thread 对象。然后事情会变得非常困惑。

(确实,请阅读 javadoc for Thread.join(long) !)

最好专门为此目的创建锁对象;例如

private final Object lock = new Object();

此外,编写扩展 Thread 的类通常不是一个好主意。通常最好实现 Runnable 接口(interface),实例化它,并将实例作为参数传递给 Thread 构造函数;例如

Thread t = new Thread(new Runnable() {
public void run() {
System.out.println("Hello world");
}});
t.start();

实现 Runnable 而不是扩展 Thread 的一个优点是,您可以更轻松地使用您的代码以及为您管理线程生命周期的东西;例如ExecutorService、fork-join 线程池或经典线程池。

第二个是可以将轻量级线程逻辑简洁地实现为匿名类......如我的示例所示。

关于java - Java中如何通知特定的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43289395/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com