我注意到当您尝试从与主线程不同的线程访问对象或属性时,某些框架会抛出异常。
如果我的对象(或我的对象中的方法)是从与创建它的对象不同的线程访问的,那么检测和抛出异常的合适方法是什么。有一些线程“拥有”一个对象吗?
答案 0 :(得分:1)
没有。语言和库没有线程的概念"拥有"任何对象。你可以很容易地自己实现它:
class MyClass {
final Thread owner;
MyClass() {
owner = Thread.currentThread();
}
void assertOwnership() {
if (Thread.currentThread() != owner) {
throw new RuntimeException("Current thread does not own: " + this);
}
}
}
编辑:但你真的想解决什么问题?关于线程的一个基本事实是它们都在相同的地址空间中运行,并且它们都可以相同地访问相同的数据。为什么你关心哪个线程"拥有"给定的对象?当一个线程访问它不拥有的对象时,应该表示什么异常?"
答案 1 :(得分:0)
您可以使用线程本地数据来强制执行此操作。框架在主线程上插入线程局部变量。当您调用框架时,它会查看线程局部变量是否存在。如果它没有,那么它会引发异常。
查看ThreadLocal类或this tutorial