HT permits a 2nd thread (2nd virtual processor) to make use of the time that would otherwise be wasted by the 1st thread (1st virtual processor) and vise versa. The processor design, when running one thread), attempts be as efficient as possible (e.g. caches data, has a pipeline, reads ahead, writes behind, etc...). Excepting for a few circumstances a single threaded processor typicaly waits infrequently. That being said, knowing what circumstance the processor tends to wait for, a programmer could specificlly write code that will encounter these wait conditions frequently. So someone could write a program where two threads are not interfering with each other.
Look at using a dual core processor if you want more efficient multi-threading.