When executing a normal query, the call returns only after the query completes. When you call the execute() method of a session instance to execute a query, the call returns after doing I/O to the cluster, waiting for the cluster to execute query and getting a response from the cluster. Meanwhile, the querying thread is idle and blocked. It can't execute other queries.
Consider the following example where you're trying to load a lot of user data. We could execute the code in a loop thousands of times, but each iteration waits for session.execute() to finish:
public ResultSet insertUserData(/* Some user data) {PreparedStatement insertUser = ...; // Prepare the statementBoundStatement bs = ... ; // Bind the statement ...