Java在线程中更改字符串值

时间:2014-04-29 21:14:45

标签: java string multithreading

我正在从我的java应用程序发送一个json到一个php页面,如果成功,echos“完成”。 json和php工作得很好。我试图将一个字符串传递给一个线程,然后将该字符串的值更改为线程中的php的回显,并且当线程完成时我想使用if语句来确定URL连接是否已成功完成...它是我无法从线程中获取字符串的值。

这是我的代码:

main.java

final String line = "unfinished";
Thread iURL = new instrURL(line, jsonArray);
iURL.start();

while(iURL.isAlive())
{
    System.out.println("In wait loop");
}


System.out.println(line);

if(line.trim() == "finished")
{
    System.out.println("Made it to finished");
}
else
{
    System.out.println("Did not make it to finished");
}

instrURL.java

public class instrURL extends Thread{

String line;
String jsonArray;

public instrURL(String line, String jsonArray)
{
    this.line = line;
    this.jsonArray = jsonArray;
}

public void run()
{

    try 
    {
        URL url = new URL("http://fake.php?jsonArray="+URLEncoder.encode(jsonArray, "UTF-8"));

        URLConnection conn = url.openConnection();

        BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));

        line = rd.readLine();

        System.out.println(line);

        rd.close();

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        catch (IOException e) {
            e.printStackTrace();
        }

    }

控制台:

In wait while loop
In wait while loop
...
...
...
In wait while loop
finished
In wait while loop
In wait while loop
In wait while loop
unfinished
Did not make it to finished

正如您从控制台中看到的,Thread获得了完成,但是一旦在Thread之外,字符串值仍未完成。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

您的流程中至少有四个名为String的{​​{1}}个参考变量,而其中一个的更新不会反映在其他变量中,这就是为什么您的程序没有& #39; t表现得如预期:

    main.java中的
  1. line - 看起来像一个 堆栈上的局部变量
  2. final String line = "unfinished"; - 一个参与者 instrURL(String line,构造函数
  3. instrURL instrURL中的成员 类
  4. instrURL.line instrURL中String line;方法中的本地
  5. 所有这些都是不同的参考,因此分配给一个不会影响任何其他参考。除此之外,我还没有看到instrURL课程中run()的任何风格的任何作业。

    一般来说,您应该使用已建立的线程间通信方法,例如line或锁定下的共享静态,但可能最接近您想要的是在某处声明静态volatile字符串行,并参考在main和你的线程类中都删除它,并删除所有其他行的副本。

答案 1 :(得分:1)

Java比较字符串与equals方法而不是==

if(null!line && line.trim().equals("finished"))
    {
        System.out.println("Made it to finished");
    }

在内部运行方法中,您不是从缓冲读取器读取数据而不是更改行的值,这就是为什么您获得与“未完成”相同的值,您需要读取这样的数据

 String currentLine
    while ((currentLine = br.readLine()) != null) {
        System.out.println(sCurrentLine);
    }

从流中读取数据后,将行字符串中的值设置为

line="finished";