protected void updateLOD(final SafeArrayList<Vector3f> locations, final LodCalculator lodCalculator) {

        if (getSpatial() == null || locations.isEmpty()) {
            return;
        }

        // update any existing ones that need updating
        updateQuadLODs();

        if (updateLodOffCount(lodCalculator)) {
            return;
        }

        if (!forceUpdate && locations.equals(lastCameraLocations) && !lodCalculator.isLodOff()) {
            return; // don't update if in same spot
        } else {

            // need to have count of last camera locations the same with count of locations
            if (lastCameraLocations.size() != locations.size()) {
                lastCameraLocations.clear();
                for (int i = 0; i < locations.size(); i++) {
                    lastCameraLocations.add(new Vector3f());
                }
            }

            // we need to update last camera locations to current
            for (int i = 0; i < locations.size(); i++) {
                lastCameraLocations.get(i).set(locations.get(i));
            }
        }

        forceUpdate = false;

        if (!lodCalcRunning.compareAndSet(false, true)) {
            return;
        }

        prepareTerrain();

        final TerrainExecutorService executorService = TerrainExecutorService.getInstance();
        indexer = executorService.submit(createLodUpdateTask(cloneVectorList(locations), lodCalculator));
    }
Call this when you remove the terrain or this control from the scene.
It will clear up any threads it had.
jme3-terrain/src/main/java/com/jme3/terrain/geomipmap/TerrainLodControl.java