I think you are right. The issue stems from the fact the threads sometimes out run each other.
Here is what I think happens. Method runResetTemplate() executes in thread T1. Then you create and start GetEraseDataThread, which is T2. Sometimes T2 executes fast enough for CPCL_Template to be set before T1 retrieves it, and sometimes it doesn't. That's why you see null there form time to time.
I think you can fix this by adding join() in between here
Code:
geterasedatathread.start();
geterasedatathread.join();
//set the input stream so we can close the thread
send_text = geterasedatathread.CPCL_Template;
What I am wondering is what it is you're trying to gain by using threads. You basically have to execute geterasedatathread.start() (T2) synchronously with T1. You have to go over the network, get the result, then send it to the printer, in this exact order. Each step is dependent on a result from the previous step. I can't see any gain from asynchronous execution of any part of it.