有没有办法搜索和访问当前正在运行的线程?

时间:2009-03-30 21:17:24

标签: java multithreading

使用Java 6:

我有一个使用Thread在后台运行任务的方法。此任务访问文件,因此该方法不能运行多个线程。

我试图弄清楚是否有一种方法可以在我的方法开头搜索活动的线程。我想知道是否有一个活动的线程已经在运行我的任务,以便我可以正确处理这种情况。

如果没有先前Thread的实际实例,这是否可行?我想避免全局保存线程的实例。

4 个答案:

答案 0 :(得分:6)

您可能需要更强大的功能,例如使用ReentrantLock来阻止对这些资源的并发访问。

答案 1 :(得分:5)

仅供参考:您可以使用java.lang.Thread.enumerate(Thread[])获取当前线程组及其子组中的所有活动线程(对于独立程序,这通常可以为您提供所有线程)。但这是解决问题的方法 - 正如Brian所说,使用锁。

答案 2 :(得分:3)

使用[ReentrantLock.tryLock](http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/locks/ReentrantLock.html#tryLock()。如果它返回false,宾果!其他一些线程当前持有锁。

答案 3 :(得分:2)

即使你有权使用这些线程,你会用这些知识做什么?你怎么知道Thread目前在做什么?

如果您有可以从多个位置访问的服务,但是您希望保证此服务仅使用一个线程,则可以设置如下的工作队列:

public class FileService
{
    private final Queue workQueue = new ArrayBlockingQueue(100/*capacity*/);

    public FileService()
    {
        new Thread()
        {
            public void run()
            {
                while(true)
                {
                    Object request = workQueue.take(); // blocks until available
                    doSomeWork(request);
                }
            }
        }.start();
    }

    public boolean addTask(Object param)
    {
        return workQueue.offer(param); // return true on success
    }
}

这里,ArrayBlockingQueue负责处理所有线程安全问题。可以从任何其他线程安全地调用addTask();它只会向workQueue添加一个“工作”。另一个内部线程将不断从workQueue中读取并执行某些操作,否则它将静静等待。