我希望,new Blocking Queue的开发能够知道队列中正在使用的对象的线程来源。
当然可以这样做:
/**
* An immutable, threadsafe object that is uniquely identified by the
* thread that created it. All extending objects must call super in the
* constructor and assert during equality that the super classes are also
* considered equal.
*
* If subclasses choose to extend this object and make their representation
* mutable, please note that the object will still be considered to originate
* from the thread it was constructed on.
*/
public class ThreadUniqueObject {
private final long threadId;
public long getThreadId() {
return threadId;
}
public ThreadUniqueObject() {
this.threadId = Thread.currentThread().getId();
}
@Override
public boolean equals(Object obj) {
if(!(obj instanceof ThreadUniqueObject)) return false;
return ((ThreadUniqueObject)obj).getThreadId() == this.getThreadId();
}
@Override
public int hashCode() {
return (int)threadId;
}
}
然后要求只能在队列中使用此类的子类。但是,是否有任何解决方案使用我不知道的一些魔法,可以检测创建对象的线程?我甚至找不到一个私人领域,我可以通过反映来表明这一点。有什么想法吗?
答案 0 :(得分:0)
显然没有创建线程id的属性。显然它扩展了没有这种方法的Object。你需要自己实现。然后在队列中你必须指定。
或者你可以创建一个标记界面,在创建对象时你可以存储线程id。但它不会强制要求它。
public interface BlockingQueue<E extends Threaded> extends Queue<E>
答案 1 :(得分:-4)
在对象的构造函数中,可以通过Thead.currentThread()
创建创建对象的线程。如果需要,请保存。很难看到为什么你需要它。