【发布时间】:2016-08-21 13:30:50
【问题描述】:
我正在作为一个使用多线程的项目的一部分进行编码,并且我正在尝试寻找方法来检测我的代码中的线程错误。 是否有一些现有的工具可以帮助我做到这一点?
例如- 断言我的方法正在被正确的线程调用 或者 某种带有注释的静态检查,类似于@Nullable 和@NotNull,以检测我的代码何时从错误的线程调用方法。
虽然项目是多线程的,但几乎不需要同步,因为不同的线程不会访问相同的对象,它们有自己的实例。 广义上讲,有四个线程同时运行
- 服务器线程 = 为一个或多个维护游戏状态 客户
- 客户端线程 = 处理用户输入,维护本地 复制/缓存服务器数据以进行渲染
- NetworkMessage 线程 = 处理传入/传出消息 服务端和客户端之间
- 渲染线程 = 将本地数据处理为渲染信息 显卡
这些类有时仅用于其中一个线程(例如,用户输入轮询仅限客户端),有时它们用于多个线程(例如,射弹的计算移动同时在客户端和服务器上使用相同的代码以减少感知滞后)。好几次我从错误的线程中调用了一个方法,导致了微妙且不可重复的错误和非常严重的显示器屏幕损坏(来自我的拳头)
到目前为止我想到的是这样的:
public void myMethodThatAssumesClientThreadOnly() {
assert checkThread(CLIENT);
// can now happily call other client-thread code without fear
}
但我更喜欢类似于@Nullable 的静态检查
例如
@Thread(CLIENT)
void myClientMethod() {
//client-only stuff here
}
@Thread(SERVER)
void myServerMethod() {
//server-only stuff here
}
@Thread(CLIENT + SERVER)
void myClientAndMethod() {
myClientMethod(); // error- server thread might call client method
}
不幸的是,作为一个注释新手,我不知道这是容易还是真的很难。
有什么建议吗?我无法想象我是第一个寻找这种东西的人。
TGG
【问题讨论】:
-
android 注释项目对此有一些支持——您可以将函数标记为会议是否在 ui 线程上。我不是大多数图书馆的粉丝,但你应该能够看看他们是如何做到的,并可能对其进行扩展
标签: java multithreading annotations assertions