我有以下问题:我有一个任务:
package window;
import javafx.concurrent.Task;
import javafx.scene.control.TextField;
import javax.xml.soap.SOAPMessage;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.*;
import java.net.Socket;
import java.net.UnknownHostException;
public class ClientConnection extends Task<Void> {
public Socket clientSocket;
private DataInputStream is = null;
private DataOutputStream os = null;
private String messageID;
private String nodeNameToSend;
private int layerNumberToSend;
private String messageTypeToSend;
private String messageToSend;
private int portNumber;
private String name;
private String soapToString(SOAPMessage message) throws TransformerException {
StringWriter sw = new StringWriter();
TransformerFactory.newInstance().newTransformer().transform(new DOMSource((message.getSOAPPart())), new StreamResult(sw));
return sw.toString();
}
public ClientConnection(String name, int portNumber) throws IOException {
this.name = name;
this.portNumber = portNumber;
clientSocket = new Socket(name, portNumber);
}
@Override
protected Void call() throws Exception {
System.out.println("trying to send in separate thread");
try {
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream(), "UTF-8"));
SoapWrapper soapWrapper = new SoapWrapper();
// Creating the message
MessageWrapper messageWrapper = new MessageWrapper(messageID, nodeNameToSend, layerNumberToSend, messageTypeToSend, messageToSend);
SOAPMessage msg = soapWrapper.toMessage(messageWrapper);
out.write(soapToString(msg));
out.flush();
out.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public void setArgs(String messageID, String name, int layerNumber, String messageType, String messageContent) {
this.messageID = messageID;
this.nodeNameToSend = name;
this.layerNumberToSend = layerNumber;
this.messageTypeToSend = messageType;
this.messageToSend = messageContent;
}
}
在我的javafx控制器中,我将其运行使用全局ClientConnection cc = new ClientConnection("localhost", 2143);
,然后通过new Thread(cc).start();
在某个地方运行它。一切都起作用(在插座上起作用(,trying to send in separate thread
印在控制台上。但是,如果我想再次执行此操作(就我而言,再次按下按钮(,它没有做任何事情,trying to send in separate thread
不会打印。我能做些什么?我读过您必须制作一个线程的新实例,但是我正在这样做,对
当您说自己有 global ClientConnection
时,我认为您的意思是您要为每次运行重复使用ClientConnection
的同一实例。由于Task
无法重复使用,如文档中所述:
与FutureTask一样,任务是单次类别,无法重复使用。
因此,您需要确保每次运行使用新的ClientConnection
覆盖cc
变量(即分配cc = new ClientConnection(...)
-在您的情况下,这是您输入操作处理程序的第一件事按钮(。