Самое простое решение вашей проблемы - использовать размер ThreadPool, равный 1. Однако на самом деле это не та проблема, которую можно использовать для решения потоков.
Расширить, если вы создаете своего исполнителя с помощью:
this.exec = Executors.newSingleThreadExecutor();
тогда все ваши потоки будут запланированы и выполнены в том порядке, в котором они были отправлены на выполнение. Существует несколько сценариев, в которых это логично, но в большинстве случаев потоки - это не тот инструмент, который нужно использовать для решения этой проблемы.
Подобные вещи имеют смысл делать, когда вам нужно выполнить задачу в другом потоке - возможно, это займет много времени, и вы не хотите блокировать поток GUI - но вы не нужно или не нужно, чтобы представленные задачи выполнялись одновременно.