我需要能够发送'从一个线程到一个或多个其他线程的字符串。但我不知道该怎么做。
基本上,我有一台服务器,它有一个连接向它发送命令。我需要将这些命令发送到所有其他线程,以便他们可以将它们发送给他们的客户端。
如何拥有所有其他线程引用的单个字符串。如何知道所有线程何时执行命令字符串?
答案 0 :(得分:0)
如果我理解你的话,这就是你的设置:
我如何拥有所有其他线程引用的单个字符串?
当字符串通过套接字或类似字符串发送时,它将是一个不同的字符串。但是内容相同,这就是重要的。所以我不会太在意这一点。
如何知道所有线程何时执行命令字符串?
每当线程完成处理所有客户端的命令时,让每个线程都向服务器发回确认。服务器会跟踪发送的所有命令和收到的确认信息。
请记住,线程可能会崩溃,连接可能会中断,命令的执行可能无法及时成功,或者完全失败。
答案 1 :(得分:0)
在某个地方,您需要List
Runnables
的{{1}}个像:
List<MyRunnable> runningThreads;
然后您将实现Runnable
:
class MyRunnable implements Runnable {
public void run() { ... }
}
现在您需要有一些方法向Runnable
发送消息。
class MyRunnable implements Runnable {
public void run() { ... }
public void sendMessage( String message ){ ... }
}
所以要发送所有可运行的消息,它就像以下一样简单:
for( MyRunnable runnable : runningThreads ){
sendMessage( "Hello There!" );
}
现在该做什么在很大程度上取决于您希望下一步使用该消息做什么。无论如何,它必须以某种方式出现在线程的可见范围内。所以对于初学者,我们可以将其保存在变量中:
class MyRunnable implements Runnable {
private volatile String myLastMessage;
public void run() { ... }
public void sendMessage( String message ){
this.myLastMessage = message;
}
因此,如果您run
已经定期运行,您可以下车:
public void run(){
while( true ){
Thread.sleep( 1000 ); //1s
if( lastMessage != null ){
doSomethingWith( lastMessage );
lastMessage = null;
}
}
}
如果你需要在线程中存储多条消息,你可以使用例如SynchronizedList
为此。
如果你需要你的线程立即对收到的消息做出反应,那么使用一个显示器和
notifyAll
方法。参见例如在这里:http://www.programcreek.com/2009/02/notify-and-wait-example/
答案 2 :(得分:0)
也许您正在引用Observer pattern(又名Publish–subscribe pattern)。服务器(发布者)需要知道他们的客户端(订阅者)才能发送公共消息,因此您需要一个数据结构。有几种方法可以实现这一点。请参阅下一个链接: