从线程返回值

时间:2017-01-31 11:35:26

标签: java multithreading

首先,是的,我在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];

                }           
            }      
    }

2 个答案:

答案 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