Смотри... Я когда-то делал на форуме эмуляцию работы банка: есть клиенты пользователи, есть кассиры, очередь клиентов, и когда подходит очередь, клиент направляется к освободившемуся кассиру...
Можно сделать нечто подобное и здесь: есть "поезд", есть "путь", на который этот поезд можно поставить, и держать его там какое-то определенное время, и отправлять дальше; если свободных путей нет - то все поезда проходят мимо. Все действия (время прибытия поезда, время отправления) фиксируются в логе, возможно - сделать еще и визуализацию (скажем, какой-нибудь ListBox, в котором будет храниться информация о путях: "свободен"/"занят, кем занят, и когда освободится")...
При таком подходе можно потоками представлять пути, а "поезда" - сделать просто структуру, хранящую ID, число вагонов (это если тебе захочется помучиться, и сделать более приближенную к реальности программу: на путь можно поставить поезд только, если длина поезда не превышает длины пути), время стоянки. Можно и поезда реализовать потоками, хотя я бы этого не делал, смысла не вижу в этом, основное "действующее лицо" в твоей программе - это все-таки Станция, и соответственно, Путь. Поезд - это так, проходящее
Через рандомные промежутки времени генерируешь "поезд", пробегаешься по "путям" в поисках свободного и способного принять этот поезд, и направляешь поезд на подходящий путь...
Только непонятно, что делать, если подходящих путей нет? Что, просто пропускать поезд на следующую станцию, пусть с ним там разбираются?
Или тебе нужно нечто совсем другое?