基于字符串的线程通信

时间:2014-07-27 09:17:19

标签: java multithreading networking

我需要能够发送'从一个线程到一个或多个其他线程的字符串。但我不知道该怎么做。

基本上,我有一台服务器,它有一个连接向它发送命令。我需要将这些命令发送到所有其他线程,以便他们可以将它们发送给他们的客户端。

如何拥有所有其他线程引用的单个字符串。如何知道所有线程何时执行命令字符串?

3 个答案:

答案 0 :(得分:0)

如果我理解你的话,这就是你的设置:

setup

  

我如何拥有所有其他线程引用的单个字符串?

当字符串通过套接字或类似字符串发送时,它将是一个不同的字符串。但是内容相同,这就是重要的。所以我不会太在意这一点。

  

如何知道所有线程何时执行命令字符串?

每当线程完成处理所有客户端的命令时,让每个线程都向服务器发回确认。服务器会跟踪发送的所有命令和收到的确认信息。

请记住,线程可能会崩溃,连接可能会中断,命令的执行可能无法及时成功,或者完全失败。

答案 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)。服务器(发布者)需要知道他们的客户端(订阅者)才能发送公共消息,因此您需要一个数据结构。有几种方法可以实现这一点。请参阅下一个链接: