Java试图使用带有Runnable的Lambda表达式来传递多线程任务中的参数

时间:2015-04-30 18:35:06

标签: java lambda scope anonymous-inner-class

基本上我尝试将 runnable 类添加到我自己的任务线程类中,执行这些任务不同的线程,我需要将参数传递给 runnable 对象,但是我在传递字符串时遇到了麻烦,正如编译器所说:

"在封闭范围内定义的局部变量接收器必须是最终的或有效的最终"

String message = networkMessage.getString();
Game.getInstance().addGameTask(new Runnable() {
            @Override
            public void run() {
                Game.getInstance().playerTalk(player.getId(), message);
            }
});

我尝试使用 Lambda with Runnable 做一些简单的事情:

Runnable r = () -> Game.getInstance().playerTalk(player.getId(), mode, receiver, channelId, message);

但是编译器会说同样的错误。

在C#中,我想出一些简单的东西:

Game.AddGameTask(() => { Game.PlayerTalk(_player.Id, message, mode, receiver, channelId); });

我可以尝试实现一些简单的事情吗?它的任务应该是游戏服务器,所以我需要添加这些"任务"到外部线程以获得更好的功能和性能。

有什么问题?

1 个答案:

答案 0 :(得分:1)

最简单的解决方案是使receiver变量为final,这意味着一旦设置了它的值,就不能再次设置它。 E.g。

final Receiver receiver = new Receiver();

或者,您可以使用AtomicReference来保存对象并允许以线程安全的方式进行访问。