在Java中将元数据附加到线程

时间:2014-03-26 11:54:38

标签: java multithreading

有没有办法将某种自定义元数据(任何对象)附加到java中的线程?例如,如果我使用ThreadPoolExecutor运行几个线程,其中一些线程附加到每个元数据并将这些线程传递到某个能够读取此元数据的处理器中?

据我从Thread的源代码看,我唯一能做的就是设置线程名称。

感谢AlexR,我已经解决了这个问题。那个记住启动这个帖子的线程的ID。

public class StarterThreadAwareThread extends Thread {

    private volatile long startedThreadId;

    public StarterThreadAwareThread(ThreadGroup group, Runnable target, String name) {
        super(group, target, name);
    }

    public long getStartedThreadId() {
        return startedThreadId;
    }

    @Override
    public synchronized void start() {
        this.startedThreadId = Thread.currentThread().getId();
        super.start();
    }
}

然后使用ThreadFactory进行一些魔术 - 覆盖新线程的创建

Thread newThread(Runnable r) {
    return new StarterThreadAwareThread(getThreadGroup(), runnable, nextThreadName());
}

然后在每个地方我们都可以静态访问提交者的线程ID,如

StarterThreadAwareThread thread = (StarterThreadAwareThread)Thread.currentThread(); // check with instaneof before casting if required
thread.getStartedThreadId();

PS:如果ThreadPoolExecutor每次调用submit时都创建新线程,则此解决方案有效。如果没有,我已经创建了更复杂的解决方案,但它应该始终无处不在: 1. http://pastebin.com/GU4S793Y 2. http://pastebin.com/f936R2rc 3. http://pastebin.com/YxuGXHiT

3 个答案:

答案 0 :(得分:0)

将元数据附加到Runnable。它不是Threads您运行的Threads运行Runnables(嗯,Threads也是Runnables,但他们会调用Runnable& #39; s run()方法。)

答案 1 :(得分:0)

您可以使实现Runnable接口的类的构造函数具有一些参数(或在其上使用setter)。然后,您可以使用instanceof查看该对象是否属于您知道包含元数据的类。

答案 2 :(得分:0)

我认为在您的情况下实现这一点的最简单方法是使用自定义线程工厂和您自己的线程实现。

创建MetadataAwareThread

public class MetadataAwareThread extends Thread {
    MetadataAwareThread(Runnable runnable, Map<String, String> metadata) {}
}

现在创建自定义线程工厂:

public class MetadataAwareThreadFactory implements ThreadFactory {
    public Thread newThread(Runnable r) {
     return new MetadataAwareThread(r, new HashMap<String, String>());
   }
}

现在您可以使用以下工厂:

Exectors.newCachedThreadPool(new MetadataAwareThreadFactory())