使用Java 6:
我有一个使用Thread在后台运行任务的方法。此任务访问文件,因此该方法不能运行多个线程。
我试图弄清楚是否有一种方法可以在我的方法开头搜索活动的线程。我想知道是否有一个活动的线程已经在运行我的任务,以便我可以正确处理这种情况。
如果没有先前Thread的实际实例,这是否可行?我想避免全局保存线程的实例。
答案 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中读取并执行某些操作,否则它将静静等待。