我的程序是每当我启动我的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();
}
}
关于重新启动此案例的线程的任何建议都是值得注意的。 提前谢谢....
答案 0 :(得分:4)
run
方法执行完毕后,线程实际上无法“重启”。您基本上有两种选择:
wait
)。这样你就可以“暂停”线程,更改主机名,然后发出信号以便恢复。Runnable
对象启动一个新线程。 编辑:因此,您可以在重启方法中执行的操作是调用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 State
或Thread Pool
(如果已实现)。与执行永久线程关联的线程类实例将失去其线程性。
- 您可以更好地使用wait()
和notify()
机制,也可以使用java.util中的await()
和signal()
机制。并发包,暂停和恢复线程。