我正在学习如何使用json Web服务的教程。
但我有两个疑惑,请你帮助我理解。
我正在从这个链接中学习 http://codeoncloud.blogspot.in/2013/05/blackberry-java-json-tutorial.html
这是一个按线程扩展的类
public class ConnectJson extends Thread {
private String url;
public String response;
private String myinterface = ";interface=wifi";
public void run() {
HttpConnection conn = null;
InputStream in = null;
int code;
try {
conn = (HttpConnection) Connector.open(this.url + this.myinterface, Connector.READ);
conn.setRequestMethod(HttpConnection.GET);
code = conn.getResponseCode();
if (code == HttpConnection.HTTP_OK) {
in = conn.openInputStream();
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buffer = new byte[in.available()];
int len = 0;
while (-1 != (len = in.read(buffer))) {
out.write(buffer);
}
out.flush();
this.response = new String(out.toByteArray());
if (out != null){
out.close();
}
if (in != null){
in.close();
}
if (conn != null){
conn.close();
}
}
} catch (Exception e) {
Dialog.inform(e.toString());
}
}
public String jsonResult(String url){
this.url = url;
this.start();
this.run();
return response;
}
}
正在制作该类的一个对象并调用该类的方法。在该方法中,它调用start以及run方法为什么?
this.start();
this.run();?
答案 0 :(得分:2)
在那个方法中它调用start和run方法为什么?
你必须问作者的代码;看着那个类的代码,它看起来不正确。这也很不寻常。
在正常情况下,您不直接致电run
;启动线程(使用start
)然后 JVM 负责创建新线程并在其上调用run
。
你可以自己调用run
,如果你真的希望代码立即在当前线程上运行,但这是不寻常的并且该类不会立即看起来像它的设计目的这是正确的。该代码实际上做的是启动一个新线程(这意味着run
最终将在该新线程上调用),但是当您观察到它时,也直接调用run
。因此run
将运行两次,并且可能会同时运行两次。由于run
中的代码使用了两个线程将使用的实例变量,但是没有做任何事情来协调对这些实例变量的访问......好吧,它看起来也不正确。
我认为我不会继续关注该教程。您可能会发现Oracle的Java教程中的Concurrency trail可能很有用。 (线程是其中的一部分。)