gpt4 book ai didi

java - 在 Java 中修改正在运行的线程内的对象

转载 作者:行者123 更新时间:2023-12-02 09:08:18 24 4
gpt4 key购买 nike

我目前正在使用 Java 开发一个简单的消息客户端应用程序,但遇到了一些问题。我的程序的后端本质上只是两个线程:一个监听器,不断等待指定端口上的消息,以及一个信使,它应该检查特定队列以查看是否有任何传出消息,如果有则发送它们做。队列是在线程外部定义的,并通过单独的函数使用消息进行更新。我已经验证在线程之外,队列已填充并且具有正确的消息;然而,在线程内部,队列完全是空的。

我尝试了一些解决方法来允许线程读取队列中的数据,例如创建“readQueue”函数,但似乎没有什么可以让我从线程中的队列中获取数据。我在这里缺少什么?这是正常的线程行为,还是我做错了什么?我附加了一些相关的代码片段,以便您更好地了解我到底在做什么。

信使线程:

    Runnable messenger = () -> {
try {
while(true) {

if( messageQueue.peek() != null) {
System.out.println(messageQueue.poll().message);
}

}
}

catch(Exception e) {
System.out.println("that really wasn't suposed to happen");
}
};
Thread thread2 = new Thread(messenger);
thread2.start();

向队列添加新消息的方法:

public static void addMessage(String message) {
if(!message.isEmpty()) {
messageQueue.add(messagePacket);
}
}

最佳答案

我在一个具有 main 方法的 Java 类中尝试了您的代码。它对我来说工作得很好。然而,我使用来自控制台的输入并调用 addMessage(),而不是端口处的监听器。 messenger 能够从队列中获取并打印。

编辑:添加类供您引用

public class TestClass{
private static Queue<Message> messageQueue = new LinkedBlockingQueue<>();

public static void main( String[] args ){
Runnable messenger = () -> {
try{
while( true ){
if( messageQueue.peek() != null ){
String message = messageQueue.poll().message;
if( message.equalsIgnoreCase( "stop" ) ) break;

System.out.println( message );
}
}
}

catch( Exception e ){
System.out.println( "that really wasn't suposed to happen" );
}
};

Thread thread2 = new Thread( messenger );
thread2.start();

readFromConsole( input -> {
addMessage( input );
} );
}

public static void addMessage( String message ){
if( !message.isEmpty() ){
Message m = new Message( message );
messageQueue.add( m );
}
}

private static void readFromConsole( Consumer<String> consumer ) {
try( Scanner in = new Scanner( new FilterInputStream( System.in ){ public void close(){} } ) ){
while( true ) {
System.out.print( "> " );
String input = in.nextLine();
if( input == null || input.trim().equals( "" ) ) {
System.out.println( "Closing..." );
break;
}

consumer.accept( input );
}
}
}

private static class Message{
public String message;

public Message( String message ){
super();
this.message = message;
}
}

}

关于java - 在 Java 中修改正在运行的线程内的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59623266/

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