Это указывает на неверное толкование функций сна. Параметр, который Вы передаете, минимум время для сна. Нет никакой гарантии, что поток проснется после точно определенное время. На самом деле потоки не 'просыпаются' вообще, но скорее выбраны для выполнения планировщиком. Планировщик мог бы принять решение ожидать намного дольше, чем требуемая продолжительность сна для активации потока, особенно если другой поток все еще активен в тот момент.
Если вы хотите сравнить строки, напишите следующий JSTL:
<c:choose>
<c:when test="${myvar.equals('foo')}">
...
</c:when>
<c:when test="${myvar.equals('bar')}">
...
</c:when>
<c:otherwise>
...
</c:otherwise>
</c:choose>
<c:choose>
<c:when test="${not empty userid and userid ne null}">
<sql:query dataSource="${dbsource}" var="usersql">
SELECT * FROM newuser WHERE ID = ?;
<sql:param value="${param.userid}" />
</sql:query>
</c:when>
<c:otherwise >
<sql:query dataSource="${dbsource}" var="usersql">
SELECT * FROM newuser WHERE username = ?;
<sql:param value="${param.username}" />
</sql:query>
</c:otherwise>