繁体   English   中英

Java在线程中更改字符串值

[英]Java changing string value in thread

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

这是我的代码:

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

从控制台可以看到,线程完成了,但是一旦在线程外,字符串值仍未完成。

任何帮助将不胜感激。

您的过程中至少有四个带有名称line String引用变量,并且对一个变量的更新不会反映在其他变量中,这就是为什么程序无法按预期运行的原因:

  1. final String line = "unfinished"; 在main.java中-看起来像堆栈上的局部变量
  2. instrURL(String line, instrURL构造函数的参数
  3. instrURL.line instrURL类中的成员
  4. String line; instrURL中run()方法中的本地

所有这些都是不同的引用,因此分配给一个不会影响其他任何一个。 甚至除此之外,我也看不到instrURL类中任何line风格的分配。

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

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

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

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

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

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

line="finished";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM