为什么客户端线程只执行一次就会被销毁? Java TCP套接字

时间:2009-12-30 04:38:38

标签: java multithreading sockets

我希望我的客户端类运行一个线程,每隔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");
    }

    }
}

3 个答案:

答案 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分钟间隔操作没有循环,或者我错过了什么?