首先,是的,我在google上查找了这个问题,但我找不到任何答案。只有答案,线程是FINISHED并且返回值。我想要的是回归"无限"价值量。
为了让你更清楚:我的线程是从套接字读取消息而从未真正完成。因此,每当有新消息进入时,我希望另一个类获取此消息。我该怎么做?
public void run(){
while(ircMessage != null){
ircMessage = in.readLine();
System.out.println(ircMessage);
if (ircMessage.contains("PRIVMSG")){
String[] ViewerNameRawRaw;
ViewerNameRawRaw = ircMessage.split("@");
String ViewerNameRaw = ViewerNameRawRaw[2];
String[] ViewerNameR = ViewerNameRaw.split(".tmi.twitch.tv");
viewerName = ViewerNameR[0];
String[] ViewerMessageRawRawRaw = ircMessage.split("PRIVMSG");
String ViewerMessageRawRaw = ViewerMessageRawRawRaw[1];
String ViewerMessageRaw[] = ViewerMessageRawRaw.split(":", 2);
viewerMessage = ViewerMessageRaw[1];
}
}
}
答案 0 :(得分:0)
您所描述的是异步通信的典型场景。通常可以使用Queue实现解决方案。你的线程是一个制作人。每次线程从套接字读取消息时,它都会构建其结果并将其发送到队列中。任何有兴趣接收结果的实体都应该收听队列(即成为消费者)。阅读有关队列的更多信息,因为您可以发送消息,以便只有一个消费者可以获得它,或者(发布)意味着所有注册的消费者都可以获得它。队列实现可以是一些可用的产品,例如Rabbit MQ,或者像Java提供的类一样简单,可以像在内存队列中一样工作。 (参见Queue接口及其各种实现)。
另一种方法是通过网络(HTTP)进行通信。你的线程从套接字读取一条消息,构建一个结果并通过http发送它,让我们说一个REST协议给一个暴露你的线程可以调用的其他API的消费者。
答案 1 :(得分:0)
为什么在线程类中没有状态变量?然后,您可以在执行期间和退出之前更新它。线程完成后,您仍然可以查询状态。
public static void main(String[] args) throws InterruptedException {
threading th = new threading();
System.out.println("before run Status:" + th.getStatus());
th.start();
Thread.sleep(500);
System.out.println("running Status:" + th.getStatus());
while(th.isAlive()) {}
System.out.println("after run Status:" + th.getStatus());
}
将线程扩展为:
public class threading extends Thread {
private int status = -1; //not started
private void setStatus(int status){
this.status = status;
}
public void run(){
setStatus(1);//running
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
setStatus(0); //exit clean
}
public int getStatus(){
return this.status;
}
}
获得输出:
before run Status:-1
running Status:1
after run Status:0