检测创建对象的线程

时间:2018-01-04 08:42:37

标签: java multithreading

我希望,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;
    }

}

然后要求只能在队列中使用此类的子类。但是,是否有任何解决方案使用我不知道的一些魔法,可以检测创建对象的线程?我甚至找不到一个私人领域,我可以通过反映来表明这一点。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

显然没有创建线程id的属性。显然它扩展了没有这种方法的Object。你需要自己实现。然后在队列中你必须指定。

或者你可以创建一个标记界面,在创建对象时你可以存储线程id。但它不会强制要求它。

public interface BlockingQueue<E extends Threaded> extends Queue<E>

答案 1 :(得分:-4)

在对象的构造函数中,可以通过Thead.currentThread()创建创建对象的线程。如果需要,请保存。很难看到为什么你需要它。