Есть ли способ поиска и доступа к темам, которые в данный момент запущены? - PullRequest
1 голос
/ 31 марта 2009

Использование Java 6:

У меня есть метод, который использует поток для запуска задачи в фоновом режиме. Эта задача обращается к файлам, поэтому метод не должен иметь возможность работать с несколькими потоками.

Я пытаюсь выяснить, есть ли способ найти активные потоки в начале моего метода. Я хочу знать, существует ли активный поток, который уже выполняет мою задачу, чтобы я мог правильно обработать ситуацию.

Возможно ли это без использования фактического экземпляра предыдущего потока? Я хотел бы избежать сохранения экземпляров потока глобально.

Ответы [ 4 ]

6 голосов
/ 31 марта 2009

Вы можете захотеть что-то более надежное, например, использовать ReentrantLock для предотвращения одновременного доступа к этим ресурсам.

5 голосов
/ 31 марта 2009

Только для справки: вы можете получить все активные потоки в группе текущего потока и его подгруппах (для автономной программы это обычно может получить все потоки) с помощью java.lang.Thread.enumerate(Thread[]). Но это не способ решить вашу проблему - как сказал Брайан, используйте замок.

3 голосов
/ 31 марта 2009

Использовать [ReentrantLock.tryLock] (http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/locks/ReentrantLock.html#tryLock(). Если возвращается false, бинго! Некоторый другой поток в настоящее время удерживает блокировку.

2 голосов
/ 31 марта 2009

Даже если бы у вас был доступ к этим темам, что бы вы сделали с этими знаниями? Как бы вы сказали, что этот поток делает в настоящее время?

Если у вас есть служба, доступ к которой можно получить из нескольких мест, но вы хотите гарантировать, что эта служба будет использовать только один поток, вы можете настроить рабочую очередь следующим образом:

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 и выполнять какую-либо операцию, если есть работа, в противном случае он будет тихо ждать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...