Для двух ExecutorServices действительно ли возможно совместно использовать пул потоков?

Как уже упоминалось в комментариях, вы можете создать фабричный класс, который будет отвечать за создание экземпляра Sb на основе предоставленного токена Sa.

public interface ISbFactory
{
    Sb Create();
}

public class SbFactory : ISbFactory
{
    private readonly Sa _sa;

    public SbFactory(Sa sa) => _sa = sa;

    public Sb Create()
    {
        var token = _sa.GrantToken();
        return new Sb(token);
    }
}

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

public class ConsumerOfSb
{
    private readonly ISbFactory _sbFactory;

    public ConsumerOfSb(ISbFactory sbFactory) => _sbFactory = sbFactory;

    public void Execute()
    {
        var sb = _sbFactory.Create();
        sb.ExecuteActionOne();
    }
}

Другой подход: внедрение зависимостей ASP.NET предоставляет методы перегрузки с «фабричным действием». Таким образом, вы можете зарегистрировать функцию, которая будет вызываться каждый раз, когда Sb экземпляр требуется как зависимость.

public void ConfigureServices(IServiceCollection services) 
{
    services.AddTransient(sa);
    services.AddTransient<Sb>(provider =>
    {
        var sa = provider.GetRequiredService<Sa>();
        var token = sa.GrantToken();
        return new Sb(token);
    });
}

При таком подходе потребителю Sb не нужно зависеть от фабрики.

7
задан Coral Doe 6 November 2012 в 08:11
поделиться

3 ответа

Отвечать на Ваш вопрос: нет, два ExecutorService объекты не могут совместно использовать пул потоков. Однако можно совместно использовать ExecutorService между Вашими объектами, или альтернативно создают несколько Исполнителей, по мере необходимости, хотя это менее рекомендуется.

Лучшее решение: совместно используйте Executor между Вашими объектами.

7
ответ дан 6 December 2019 в 14:10
поделиться

Короткий ответ: Нет.

Более длинный ответ: Вам будет нужна Ваша собственная реализация, чтобы сделать это. ExecutorService интерфейс и AbstractExecutorService довольно легко реализовать. Если Вы хотите два ExecutorService совместно используя тот же ThreadPool (например, с другим максимальным активным значением потока), можно использовать шаблон "proxy" для создания совместного использования ThreadPool ExecutorService.

6
ответ дан 6 December 2019 в 14:10
поделиться

Можно ли просто передать ссылку на существующий ExecutorService к объектам рабочего?

public class Task implements Runnable {
    private final ExecutorService threadPool;
    private final SubTask[] subtasks;

    public Task(ExecutorService threadPool) {
        this.threadPool = threadPool;
        this.subtasks = createSubtasksIGuess();
    }

    public void run() {
        for(SubTask sub : subtasks)
            threadPool.submit(sub);
    }
}
2
ответ дан 6 December 2019 в 14:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: