В моей программе создаются новые потоки через new Thread(() -> {}) и Executors.newFixedThreadPool();
Вопрос как эти потоки потом удалить что бы небыло и следа их существования и что бы при создании новых потоков небыло OutOfMemoryError из за старых потоков
Зачем удалять? В java всё удаляется через GC. Достаточно завершить Thread и всё исчезнет само. Скоро.
Если вопрос в большом кол-ве Thread объектов, стоит пересмотреть подход и делать их в меньших кол-вах. Или переиспользовать как-либо.