Выдвижение нескольких задач в одном потоке - PullRequest
0 голосов
/ 25 августа 2018

Привет, я пытаюсь сделать что-то вроде этого:

У меня есть несколько потоков на одной стороне (скажем, A) и один поток на одной стороне (скажем, B).Потоки на стороне A делают некоторые вещи, и обычно нужно передать какую-то задачу потоку B. Как это сделать в Java?

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

1 Ответ

0 голосов
/ 25 августа 2018

Вся проблема может быть решена с помощью двух экземпляров ExecutorSevice .

Вам вообще не нужно создавать Thread.Просто имейте фиксированный пул потоков на одной стороне (A) и отправляйте задачи на однопоточную одну на другой стороне (B).

Простой пример:

public static void main(final String[] args) throws InterruptedException {

    final ExecutorService parallel = Executors.newFixedThreadPool(10);
    final ExecutorService single = Executors.newSingleThreadExecutor();

    final List<Callable<Void>> parallelTasks = IntStream.range(0, 10)
            .mapToObj(i -> (Callable<Void>) () -> {
                LockSupport.parkNanos(Duration.ofMillis(100).toNanos());
                System.out.printf("%s parallel %s%n", Thread.currentThread().getName(), i);
                single.submit(() -> {
                    System.out.printf("%s synchronous %s%n", Thread.currentThread().getName(), i);
                });
                return null;
            }).collect(toList());

    parallel.invokeAll(parallelTasks);
    parallel.shutdown();
    parallel.awaitTermination(1, TimeUnit.DAYS);
    single.shutdown();
    single.awaitTermination(1, TimeUnit.DAYS);
}

Вывод:

pool-1-thread-1 parallel 0  
pool-1-thread-4 parallel 3  
pool-1-thread-3 parallel 2  
pool-1-thread-2 parallel 1  
pool-1-thread-9 parallel 8  
pool-1-thread-6 parallel 5  
pool-1-thread-8 parallel 7  
pool-1-thread-7 parallel 6  
pool-1-thread-5 parallel 4
pool-2-thread-1 synchronous 3
pool-1-thread-10 parallel 9  
pool-2-thread-1 synchronous 1  
pool-2-thread-1 synchronous 8  
pool-2-thread-1 synchronous 2  
pool-2-thread-1 synchronous 5  
pool-2-thread-1 synchronous 7  
pool-2-thread-1 synchronous 0  
pool-2-thread-1 synchronous 6  
pool-2-thread-1 synchronous 4  
pool-2-thread-1 synchronous 9  
...