Вам не нужно, чтобы каждый метод / класс выполнялся в своем собственном потоке или для реализации метода run. Что вы должны сделать, это то, что для каждого действия, которое может выполнить пользователь, должен быть соответствующий класс, который реализует Действие (или что-то подобное интерфейс). Когда пользователь вызывает действие в пользовательском интерфейсе, вы должны добавить это действие в очередь.
Затем отдельный пул потоков должен принимать действия из очереди и выполнять их (с помощью метода, предоставляемого интерфейсом действий).
Вы должны убедиться, что каждое действие является потокобезопасным и способно запускаться одновременно с другими действиями. Это не простая задача, и, как правило, это не то, что могут сделать новички.
Для вас может быть достаточно просто отделить код рендеринга от кода обработки (таким образом, только 2 потока, пользователи могут выполнять только одно действие за раз).