Java运行任务<;无效>;不止一次

Java运行任务<;无效>;不止一次,java,multithreading,javafx,task,Java,Multithreading,Javafx,Task,我有以下问题:我有一个任务: 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; i

我有以下问题:我有一个任务:

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.concurrent.Task;
导入javafx.scene.control.TextField;
导入javax.xml.soap.SOAPMessage;
导入javax.xml.transform.TransformerConfiguration异常;
导入javax.xml.transform.TransformerException;
导入javax.xml.transform.TransformerFactory;
导入javax.xml.transform.dom.DOMSource;
导入javax.xml.transform.stream.StreamResult;
导入java.io.*;
导入java.net.Socket;
导入java.net.UnknownHostException;
公共类ClientConnection扩展任务{
公共套接字clientSocket;
私有DataInputStream为空;
私有DataOutputStream os=null;
私有字符串messageID;
私有字符串nodeNameToSend;
私人int LayerNumber-ToSend;
私有字符串messageTypeToSend;
私有字符串messageToSend;
专用int端口号;
私有字符串名称;
私有字符串soapToString(SOAPMessage消息)引发TransformerException{
StringWriter sw=新的StringWriter();
TransformerFactory.newInstance().newTransformer().transform(新DOMSource((message.getSOAPPart())),新StreamResult(sw));
返回sw.toString();
}
公共ClientConnection(字符串名称,int端口号)引发IOException{
this.name=名称;
this.portNumber=portNumber;
clientSocket=新套接字(名称、端口号);
}
@凌驾
受保护的Void调用()引发异常{
System.out.println(“尝试发送单独的线程”);
试一试{
BufferedWriter out=新的BufferedWriter(新的OutputStreamWriter(clientSocket.getOutputStream(),“UTF-8”);
SoapWrapper SoapWrapper=新的SoapWrapper();
//创建消息
MessageWrapper MessageWrapper=新的MessageWrapper(messageID、nodeNameToSend、LayerNumber ToSend、messageTypeToSend、messageToSend);
SOAPMessage msg=soapWrapper.toMessage(messageWrapper);
out.write(soapToString(msg));
out.flush();
out.close();
}捕获(未知后异常e){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
返回null;
}
public void setArgs(String messageID、String name、int layernnumber、String messageType、String messageContent){
this.messageID=messageID;
this.nodeNameToSend=名称;
this.layerNumberToSend=layerNumber;
this.messageTypeToSend=messageType;
this.messageToSend=messageContent;
}
}

在我的JavaFX控制器中,我使用一个全局
ClientConnection cc=newclientconnection(“localhost”,2143)来运行它新线程(cc.start())在某处运行它。一切正常(它在套接字上正常工作),
尝试在单独的线程中发送时会打印到控制台。但是,如果我想再次执行此操作(在我的情况下,再次按下按钮),它不会执行任何操作,
尝试在单独的线程中发送
不会被打印出来。我能做什么?我已经读到你必须创建一个线程的新实例,但我正在这样做,对吗?

当你说你有一个全局
ClientConnection
时,我假设你的意思是你试图在每次运行时重用同一个
ClientConnection
实例。这将不起作用,因为
任务
不可重用:

与FutureTask一样,任务是一次性类,不能重用

因此,您需要确保在每次运行时使用新的
ClientConnection
覆盖
cc
变量(即分配
cc=newclientconnection(…)
——在您的情况下,这将是在为按钮输入操作处理程序时要做的第一件事)