0

私のプログラムは、AccelSender プログラムを開始するたびに、epnId をサーバー マシンに送信して、その特定の epnId のホストを要求します。サーバーが hostName を返すとnew DataTransmitter(hostName,epnId)、 と newという 2 つの Runnable Thread クラスを開始しますJMSConnection()

私がやろうとしているのは、myreStart(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();
    }
}

この場合のスレッドの再起動に関するアドバイスはかなりのものです。前もって感謝します ....

4

3 に答える 3

4

runメソッドの実行が終了すると、スレッドを実際に「再開」することはできません。基本的に 2 つのオプションがあります。

  1. wait条件が満たされたときにスレッドを中断させるループを導入します (たとえば、 a を呼び出します)。そうすれば、スレッドを「一時停止」し、ホスト名を変更してから、再開するように通知できます。
  2. スレッドにそのコードを終了させ、それを破棄してから、同じRunnableオブジェクトで新しいスレッドを開始します。

編集:再起動メソッドでできることは、オブジェクトcloseのメソッドを呼び出すことです。dtこれによりソケットが閉じIOExceptionられ、スレッドが実行メソッドを終了する原因となります。その後、新しいスレッドを開始できます。

dt = new DataTransmitter(hostName,epnId);
new Thread(dt).start();
于 2012-09-18T07:26:07.327 に答える
1

Thread.currentThread().isInterrupted() および Thread.interrupt() を使用する

このリンクを参照してください:

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

于 2012-09-18T07:23:12.263 に答える
0

Thread一度やめましたcan't be restarted

-スレッド クラス インスタンスに関連付けられた実行のスレッドがそのrun()メソッドを終了すると、実装されている場合はDead State、またはに移動しThread Poolます。Execution のスレッドに関連付けられていた Thread Class Instance は、その Threadness を永久に失います。

-wait() andnotify()メカニズムをより適切に使用できます。また、java.util.concurrent パッケージのawait()andメカニズムを使用して、スレッドを中断および再開することもできます。signal()

于 2012-09-18T07:37:11.553 に答える