Ваша проблема не в семафоре, а в ваших темах.Ваш метод run не выполняется, потому что вы создаете новые экземпляры Thread, которые не имеют представления о классах, которые вы создали, и запускаете их, а не делаете что-либо с классами, которые вы создали.Таким образом, ваши методы запуска никогда не вызываются.
В частности, такие строки:
Thread t = new Thread();
t.start();
не имеют ссылки на классы, в которых они содержатся. Они просто создают новый объект Thread, которыйимеет только метод запуска по умолчанию и затем запускает его.
На этом сайте есть примеры того, как запускаются потоки (либо путем расширения потока, либо путем реализации Runnable).Однако вам придется немного реструктурировать свой код, чтобы он заработал.Хотя это может сработать, просто изменив строки на
Thread t = new Thread(this);
, это плохая идея, поскольку вы передаете объект как значение, пока его конструктор еще работает.Лучше было бы, чтобы ваш метод main создавал каждый объект, а затем использовал их для запуска запущенных потоков.