Задать вопрос
@artemfisher

Как работает ForkJoinPool.ManagedBlocker?

Добрый день!

Насколько я понял, ForkJoinPool.ManagedBlocker - это отдельная блокирующая задача. С помощью реализации этого интерфейса ForkJoinPool определяет нужно ли создавать дополнительный поток для поддержания требуемого уровня параллелизма.

Но после выполнения следующего кода возникли вопросы:

public class MainClass {

	public static void main (String[] args) throws Exception
	{
		var pool = new ForkJoinPool(10);
		
		ForkJoinPool.managedBlock(new MyBlocker(1));
		System.out.println("AAA");	
	}	
	
	static class MyBlocker implements ForkJoinPool.ManagedBlocker
	{
		private int n;
		
		MyBlocker(int n)
		{
			this.n = n;
		}
		
		public boolean block() throws InterruptedException
		{
			System.out.println("MyBlocker block:" + Thread.currentThread().getName());
			return false;
		}
		
		public boolean isReleasable()
		{
			System.out.println("MyBlocker isReleasable:" + Thread.currentThread().getName());
			if(this.n==1)
			{
				try
				{
					Thread.sleep(2000);
					this.n--;
					return false;
				}
				catch(InterruptedException ex)
				{
					System.out.println(ex.getMessage());
				}
				
			}
			return true;
		}
		
	}
}


Выведет:
MyBlocker isReleasable:main
MyBlocker block:main
MyBlocker isReleasable:main
AAA


Вопросы:
1. Почему задача выполняется не в потоке из пула, а в главном потоке и как заставить выполняться в пуле?
2. Если есть возможность выполнять потоки в пуле, как заставить выполняться в моем пуле? ForkJoinPool.managedBlock - статический метод.
3. Есть ли возможность заставить выполняться задачу в пуле асинхронно? (не блокируя основной поток)
  • Вопрос задан
  • 24 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
Vamp
@Vamp
Метод ForkJoinPool.managedBlock должна вызывать джоба, уже выполняющаяся в пуле:
public static void main (String[] args) throws Exception
    {
        var pool = new ForkJoinPool(10);
        var job = pool.submit(() -> {
            ForkJoinPool.managedBlock(new MyBlocker(1));
            System.out.println("AAA");
            return "done";
        });
        System.out.println(job.get());
    }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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