Чтобы защититься от бесконечных циклов, вам нужно поместить его в отдельный процесс, чтобы его можно было убить.
Чтобы защититься от создания потоков, вам необходимо расширить SecurityManager (реализация по умолчанию разрешает ненадежному коду обращаться к группам потоков без полномочий root).
Безопасность Java позволяет вам запретить доступ к файловой системе.
Что касается ограничений базы данных, вы можете использовать стандартную пользовательскую безопасность SQL, но она довольно слабая. В противном случае вам необходимо предоставить API, который обеспечивает соблюдение ваших ограничений.
Редактировать: я должен отметить, что версия Rhino, поставляемая с JDK6, выполняла работу по обеспечению безопасности, но не включает компилятор.