Java在线程中更改字符串值
我正在从我的java应用程序向php页面发送一个json,如果成功的话,它会回显“finished”。json和php工作得很好。我试图将字符串传递给线程,然后将字符串的值更改为线程中php的回音,当线程完成时,我想使用if语句来确定URL连接是否成功完成。。。我就是不能从线程中得到字符串的值 这是我的密码: main.javaJava在线程中更改字符串值,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.
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()
方法中的本地line
的任何风格
一般来说,您应该使用已建立的线程间通信方法,如
Future
,或锁下的共享静态,但最接近您想要的可能是在某个地方声明一个静态易失性字符串行,并在main和thread类中引用它,并删除该行的所有其他副本。在您的过程中至少保存四个不同的字符串
引用变量,其中一个变量的更新不会反映在其他变量中,这就是为什么您的程序不能按预期运行:
instrURL(字符串行,
-用于
instrURL
构造函数指令行
指令行中的成员
阶级String行;
instrURL中的run()
方法中的本地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");
}
内毒冰毒