Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java在线程中更改字符串值_Java_String_Multithreading - Fatal编程技术网

Java在线程中更改字符串值

Java在线程中更改字符串值,java,string,multithreading,Java,String,Multithreading,我正在从我的java应用程序向php页面发送一个json,如果成功的话,它会回显“finished”。json和php工作得很好。我试图将字符串传递给线程,然后将字符串的值更改为线程中php的回音,当线程完成时,我想使用if语句来确定URL连接是否成功完成。。。我就是不能从线程中得到字符串的值 这是我的密码: main.java final String line = "unfinished"; Thread iURL = new instrURL(line, jsonArray); iURL.

我正在从我的java应用程序向php页面发送一个json,如果成功的话,它会回显“finished”。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 在wait-while循环中 在wait-while循环中 ... ... ... 在wait-while循环中 完成 在wait-while循环中 在wait-while循环中 在wait-while循环中 未完成 没有完成 正如您在控制台中看到的,线程完成了,但是一旦超出线程,字符串值仍然没有完成


任何帮助都将不胜感激。

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

  • 最后一行字符串=“未完成”看起来像
    堆栈上的局部变量
  • instrURL(字符串行,
    -用于
    instrURL
    构造函数
  • 指令行
    指令行中的成员 阶级
  • String行;
    instrURL中的
    run()
    方法中的本地
  • 所有这些都是不同的引用,因此分配给其中一个不会影响其他任何引用。甚至除此之外,我在instrURL类中根本没有看到任何分配给
    line
    的任何风格


    一般来说,您应该使用已建立的线程间通信方法,如
    Future
    ,或锁下的共享静态,但最接近您想要的可能是在某个地方声明一个静态易失性字符串行,并在main和thread类中引用它,并删除该行的所有其他副本。

    在您的过程中至少保存四个不同的
    字符串
    引用变量,其中一个变量的更新不会反映在其他变量中,这就是为什么您的程序不能按预期运行:

  • main.java中的最后一行字符串=“未完成”
  • -看起来像 堆栈上的局部变量
  • instrURL(字符串行,
    -用于
    instrURL
    构造函数
  • 指令行
    指令行中的成员 阶级
  • String行;
    instrURL中的
    run()
    方法中的本地
  • 所有这些都是不同的引用,因此分配给其中一个不会影响其他任何引用。甚至除此之外,我在instrURL类中根本没有看到任何分配给
    line
    的任何风格


    一般来说,您应该使用已建立的线程间通信方法,如
    Future
    ,或锁下的共享静态,但最接近您想要的可能是在某个地方声明一个静态易失性字符串行,并在main和thread类中引用它,并删除该行的所有其他副本。

    在您的过程中至少保存四个不同的
    字符串
    引用变量,其中一个变量的更新不会反映在其他变量中,这就是为什么您的程序不能按预期运行:

  • main.java中的最后一行字符串=“未完成”
  • -看起来像 堆栈上的局部变量
  • instrURL(字符串行,
    -用于
    instrURL
    构造函数
  • 指令行
    指令行中的成员 阶级
  • String行;
    instrURL中的
    run()
    方法中的本地
  • 所有这些都是不同的引用,因此分配给其中一个不会影响其他任何引用。甚至除此之外,我在instrURL类中根本没有看到任何分配给
    line
    的任何风格


    一般来说,您应该使用已建立的线程间通信方法,如
    Future
    ,或锁下的共享静态,但最接近您想要的可能是在某个地方声明一个静态易失性字符串行,并在main和thread类中引用它,并删除该行的所有其他副本。

    在您的过程中至少保存四个不同的
    字符串
    引用变量,其中一个变量的更新不会反映在其他变量中,这就是为什么您的程序不能按预期运行:

  • main.java中的最后一行字符串=“未完成”-看起来像 堆栈上的局部变量
  • instrURL(字符串行,
    -用于
    instrURL
    构造函数
  • 指令行
    指令行中的成员 阶级
  • String行;
    instrURL中的
    run()
    方法中的本地
  • 所有这些都是不同的引用,因此分配给其中一个不会影响其他任何引用。甚至除此之外,我在instrURL类中根本没有看到任何分配给
    line
    的任何风格


    一般来说,您应该使用已建立的线程间通信方法,例如
    Future
    ,或者在锁下使用共享静态,但最接近您想要的可能是在某个地方声明一个静态易失性字符串行,并在main和thread类中引用它,并删除该行的所有其他副本。

    Java将字符串与等于方法进行比较,而不是与==

    if(null!line && line.trim().equals("finished"))
        {
            System.out.println("Made it to finished");
        }
    
    在run方法中,您没有从缓冲读取器读取数据,也没有更改行的值,这就是为什么您得到与“unfinished”相同的值,您需要像这样读取数据

     String currentLine
        while ((currentLine = br.readLine()) != null) {
            System.out.println(sCurrentLine);
        }
    
    从流中读取数据后,将行字符串中的值设置为

    line="finished";
    

    Java compare string with equals方法不with==

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