isPrime Number Algorithm
Code review:

As a rule, it's almost never a good idea to create your own thread directly - better to  let an ExecutorService do the thread management for you.

if (isPrime(i) == true)


should be written

if (isPrime(i))


similarly

if ( count &gt; 0 )
{
    //number is prime
    return true;
}
else
{
    //number is not prime
    return false;
}


should be

return count &gt; 0 ;


You should also write some tests, since this condition looks backwards.

But for this specific case, kasperd has the right idea - you don't care how many different factors that the number has, just whether or not it is prime; early exit is the right answer here.

It would improve the code to separate the calculation from the reporting.

interface PrimeListener {
    void onPrime(long prime);
}

class TrivialPrimeListener implements PrimeListener {
    private final PrintStream out;

    TrivialPrimeListener (PrintStream out) {
        this.out = out;
    }

    TrivialPrimeListener () {
        this(System.out);
    }


    void onPrime(long prime) {
        // Even better would be to make this flexible about where it
        // sends t
        out.println(prime + " is prime");
    }
}


Then your loop would look like:

for ( long primeCandidate = start ; primeCandidate &lt;= last ; primeCandidate++)
{
    if (isPrime(primeCandidate))
    {
        this.listener.onPrime(primeCandidate);
    }

}


And your initialization code would look something like

    this.startNum = start;
    this.endNum = end;
    this.listener = new TrivialPrimeListener();