我希望我的客户端类运行一个线程,每隔5秒就会连续向服务器发送一个String信息(order)。但相反,线程在发送第一个订单后被销毁。我不知道为什么以及如何阻止它,有人可以帮助我吗?
以下代码;
public class Cashier implements Runnable
{
private static final int MAX_DELAY = 5000;
static OrderList orderList;
static Socket socket;
static PrintWriter out = null;
static BufferedReader in = null;
int orderNumber = 0;
public String order, strorderNumber;
public static void main(String[] args){
Cashier newCashier = new Cashier();
Thread cashierThread = new Thread(newCashier);
cashierThread.setName("Olaf");
cashierThread.setDaemon(false);
cashierThread.start();
try {
socket = new Socket("127.0.0.1", 4444);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), true);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void run()
{
try{
Date now = new Date();
Format fTime = new SimpleDateFormat("hh:mm:ss a");
order = ("Order made by " + Thread.currentThread().getName()+ " at " + fTime.format(now)+ "\n");
out.print(order);
Random randomNumber = new Random();
Thread.sleep(randomNumber.nextInt(MAX_DELAY));
} catch (InterruptedException exception){
System.out.println("Olafs interrupted exception");
}
}
}
答案 0 :(得分:2)
您的类的run
方法不包含循环,因此它将执行它必须执行的操作一次然后掉到底部,有效地终止该线程。
如果您希望它连续运行,您需要以下内容:
public void run() {
boolean keepGoing = true;
while (keepGoing) {
try {
Date now = new Date();
Format fTime = new SimpleDateFormat("hh:mm:ss a");
order = "Order made by " + Thread.currentThread().getName()
+ " at " + fTime.format(now)+ "\n";
out.print(order);
Random randomNumber = new Random();
Thread.sleep(randomNumber.nextInt(MAX_DELAY));
} catch (InterruptedException exception){
System.out.println("Olafs interrupted exception");
keepGoing = false;
}
}
}
答案 1 :(得分:2)
@paxdiablo为您解决了问题。你的“为什么”问题的答案就在于Thread API的工作方式;特别是Thread.start()
方法。 javadoc说:
public void start()
使该线程开始执行; Java虚拟机调用此线程的run方法。
结果是两个线程同时运行:当前线程(从调用start方法返回)和另一个线程(执行其run方法)。
不止一次启动线程永远不合法。特别是,一旦完成执行,线程可能无法重新启动。
这表示通过调用start
方法启动Thread,该方法调用线程的run
方法一次。这反过来调用您作为构造函数参数提供的run
的{{1}}方法...一次。 (如果你要扩展Runnable
类,并覆盖Thread
方法,那么第二步通常不会发生。但这是一个副问题。)
当Thread.run()
方法返回时,Runnable.run()
方法返回,就是这样。线程终止,它的堆栈被吹走,你无法再次启动它。您所能做的就是通过Thread.run()
对象检查线程状态的剩余部分。
答案 2 :(得分:1)
嗯..执行5分钟间隔操作没有循环,或者我错过了什么?