【问题标题】:Is there a way to search for and access Threads that are currently running?有没有办法搜索和访问当前正在运行的线程?
【发布时间】:2009-03-30 21:17:24
【问题描述】:

使用 Java 6:

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

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

如果没有前一个线程的实际实例,这可能吗?我想避免全局保存 Thr​​ead 的实例。

【问题讨论】:

  • 有什么好的理由不保存线程的实例吗?请详细说明。

标签: java multithreading


【解决方案1】:

您可能想要一些更健壮的东西,例如使用ReentrantLock 来防止对这些资源的并发访问。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        即使您可以访问这些线程,您会如何处理这些知识?您如何判断该线程当前在做什么?

        如果你有一个可以从多个地方访问的服务,但你想保证这个服务只使用一个线程,你可以像这样设置一个工作队列:

        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中读取并执行一些操作,否则它会安静地等待。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-10
          • 1970-01-01
          • 2021-12-13
          • 2014-12-14
          相关资源
          最近更新 更多