Добрый день!
Насколько я понял, 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. Есть ли возможность заставить выполняться задачу в пуле асинхронно? (не блокируя основной поток)