如何使用新配置停止和启动Thread?

时间:2012-09-18 07:10:22

标签: java multithreading sockets

我的程序是每当我启动我的AccelSender程序时,它会将epnId发送到我的服务器机器以请求该特定epnId的主机。当服务器返回hostName时,它会启动两个名为new DataTransmitter(hostName,epnId)和新JMSConnection()的Runnable Thread类。

我想要做的是每当调用reStart(String hostName)时,我想停止new DataTransmitter(hostName,epnId)线程并通过设置新的hostName启动它。

这是我的代码:

public class AccelSender {

        private Socket kkSocket = null;
        private PrintWriter out = null;
        private BufferedReader in = null;

        private static final String epnId = "EPN1";

        public AccelSender(){
        }

        public void requestHost(){

            try{
                Socket hostSocket = new Socket("10.3.2.227",1121);
                PrintWriter out = new PrintWriter(hostSocket.getOutputStream(), true);
                BufferedReader in = new BufferedReader(new InputStreamReader(hostSocket.getInputStream()));
                out.println(epnId);
                    while(true){
                        String hostName = in.readLine();
                        DataTransmitter dt = new DataTransmitter(hostName,epnId);
                        JMSConnection jms = new JMSConnection();
                        new Thread(dt).start();
                        new Thread(jms).start();
                    }
            }
            catch(Exception e){
                e.printStackTrace();
            }
        }

    public void reStart(String hostName){
    //Here i want to STOP the DataTransmitter Thread and,
 START with new hostName
        }

    }

Runnable类的代码:

public class DataTransmitter implements Runnable {

    private Socket kkSocket = null;
    private PrintWriter out = null;
    private BufferedReader in = null;

    private int port = 2508, fileCount = 0, arrivalRate = 500;
    private String hostName = null, data = null, filename = null;
    private boolean resetSender = false;
    private static String epnId = null;
    File folder = new File(System.getProperty("user.dir")+"/input_data");
    File[] listOfFiles = folder.listFiles();

    public DataTransmitter(){
    }


    public DataTransmitter(String hostName, String epnId){

        this.hostName = hostName;
        this.epnId = epnId;
        establishHostConnection();
    }

    public void establishHostConnection(){

        try {
            kkSocket = new Socket(hostName, port);
            out = new PrintWriter(kkSocket.getOutputStream(), true);
            in = new BufferedReader(new 
InputStreamReader(kkSocket.getInputStream()));
            resetSender = true;
        } catch (UnknownHostException e) {
            System.err.println("Don't know about host: thinklatch.");
            System.exit(1);
        } catch (IOException e) {
            System.err.println("Couldn't get I/O for the connection to: 
thinklatch.");
            System.exit(1);
        }
    }

    public void close() throws IOException{

        kkSocket.close();
        out.close();
        in.close();
    }

    public void run(){

        System.out.println("Entering Data Transmitter");

        try{
            while (fileCount <= 1) {


                for (int i = 0; i < listOfFiles.length; i++) {
                    if (listOfFiles[i].isFile()) {
                        System.out.println("File " + 
listOfFiles[i].getName());
                        filename = System.getProperty("user.dir") + 
"/input_data/" + listOfFiles[i].getName();

                        BufferedReader bf = new BufferedReader(new 
FileReader(filename));
                        System.out.println("Fetching input from : " + 
filename);

                        while((data=bf.readLine())!=null){
                            String str = 
this.hostName+","+this.epnId+","+arrivalRate+","+data;
                            out.println(str);
                            try{
                                TimeUnit.MILLISECONDS.sleep(2);
                            }catch(Exception e){
                            }
                        }
                    }
                }
                     fileCount++;
            }
        }catch(FileNotFoundException fnfe){
            System.err.println("E"+fnfe);
        }catch(IOException ioe){
            System.err.println("E"+ioe);
        }
            out.close();
    }
}

关于重新启动此案例的线程的任何建议都是值得注意的。 提前谢谢....

3 个答案:

答案 0 :(得分:4)

run方法执行完毕后,线程实际上无法“重启”。您基本上有两种选择:

  1. 在满足条件时引入一个循环,导致线程被挂起(例如,调用wait)。这样你就可以“暂停”线程,更改主机名,然后发出信号以便恢复。
  2. 导致线程完成其代码,丢弃它,然后使用相同的Runnable对象启动一个新线程。
  3. 编辑:因此,您可以在重启方法中执行的操作是调用close对象上的dt方法。这将关闭套接字并导致IOException使线程退出其run方法。之后你可以开始一个新的线程:

    dt = new DataTransmitter(hostName,epnId);
    new Thread(dt).start();
    

答案 1 :(得分:1)

使用Thread.currentThread()。isInterrupted()和Thread.interrupt()

请看这个链接:

http://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html

答案 2 :(得分:0)

Thread一旦停止can't be restarted

- 一旦与线程类实例关联的执行线程完成其run()方法,它就会移动到Dead StateThread Pool(如果已实现)。与执行永久线程关联的线程类实例将失去其线程性。

- 您可以更好地使用wait()notify()机制,也可以使用java.util中的await()signal()机制。并发包,暂停和恢复线程。