假设我们有这个简单的例子:
public Example extends Thread{
String temp;
public Example(){
}
@Override
public void run(){
.
.
.
.
temp = "a_value";
}
public static void main(String[] args) {
Example th = new Example();
th.start();
}
}
Run Code Online (Sandbox Code Playgroud)
Thread完成工作后怎么能给我返回String temp?
在android我正在为url连接创建线程.在线程中我将响应消息存储在全局声明的字符串中.当我访问方法方法时,它返回null.
public class Rate_fetch {
String total="";
public String rate(String dt)
{
new Thread(new Runnable(){
public void run(){
try {
URL url = new URL(tally_ipaddr+"/prorate.jsp?plist="+sss.toString().trim());
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
BufferedReader r = new BufferedReader(new InputStreamReader(in));
String x = "";
String total = "";
x = r.readLine();
int i=0;
while(x.length()>1)
{
total=total+x.toString().trim();
i++;
x = r.readLine();
}
}
catch(Exception e){
return e.toString();
}
}
}).start();
return total;
}
Run Code Online (Sandbox Code Playgroud)
当我调用该方法时,它返回null.
Rate_fetch rf=new Rate_fetch();
String amt= rf.rate(prodList);
Run Code Online (Sandbox Code Playgroud) Java 代码简化后如下所示:
while(someCondition)
{
SomeType a = CalcResult(param1);
SomeType b = CalcResult(param2);
SomeType c = CalcResult(param3);
// Do something with a, b and c
}
Run Code Online (Sandbox Code Playgroud)
CalcResult()很费时间。该应用程序在 SMP 系统上运行。有人试图尝试在自己的 CPU 上同时运行所有三个计算,而不是按顺序运行它们。需要并行的始终是这 3 个任务,而不是任意数量的任务(这就是算法)。每项任务可能比其他任务花费更多或更少的时间,但通常差异不会那么大 (20-30%)。
由于他们需要返回结果,我从/sf/answers/640429471/查看了执行器服务解决方案:
ExecutorService executor = Executors.newSingleThreadExecutor();
Callable<Integer> callable = new Callable<Integer>() {
@Override
public Integer call() {
return 2;
}
};
Future<Integer> future = executor.submit(callable);
// future.get() returns 2
executor.shutdown();
Run Code Online (Sandbox Code Playgroud)
由于我对 Java 的经验主要是 servlet/JSP 开发,所以我没有线程方面的经验,并且不确定该代码片段是否适用于 3 个任务而不是一个任务。
如何提交3个任务,每个任务都有自己的参数值,并等待所有任务都返回计算结果,同时确保为它们创建线程不会抵消在自己的CPU上运行的优势,即是否有一个在循环开始之前创建线程一次while(),然后简单地将新的paramN线程推入循环内的每个线程,唤醒它们,并等待它们执行所有计算的方法?
我是线程概念的新手,我正在努力学习....
我遇到了一种情况,我有一个方法,它返回一个学生列表......以及其他方法,使用此列表来提取学生的其他详细信息,如ParentsName,他们参与的体育等(基于StudentID)..我尝试使用以下代码返回列表,似乎它不起作用:(
import java.util.ArrayList;
public class studentClass implements Runnable
{
private volatile List<Student> studentList;
@Override
public void run()
{
studentList = "Mysql Query which is returning StudentList(StudentID,StudentName etc)";
}
public List<Student> getStudentList()
{
return studentList;
}
}
public class mainClass
{
public static void main(String args[])
{
StudentClass b = new StudentClass();
new Thread(b).start();
// ...
List<Student> list = b.getStudentList();
for(StudentClass sc : b)
{
System.out.println(sc);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我使用此链接 - 从Thread返回值
列表为NULL.
我哪里错了...... ???
我想知道是否有一个很好的方法可以从正在运行的线程返回对象。在我的android项目中(对于这个问题并不重要),我有以下方法:
public void getFolders()
{
Thread t = new Thread(new Runnable()
{
@Override
public void run()
{
List<File> result = new ArrayList<File>();
Files.List request = null;
do
{
try
{
request = service.files().list();
request.setQ("'appdata' in parents");
FileList files = request.execute();
result.addAll(files.getItems());
request.setPageToken(files.getNextPageToken());
}
catch (IOException e)
{
System.out.println("An error occurred: " + e);
request.setPageToken(null);
}
}
while (request.getPageToken() != null && request.getPageToken().length() > 0);
}
});
t.start();
}
Run Code Online (Sandbox Code Playgroud)
此方法从Internet上获取一些数据并将结果存储在中List<File> result。这就是为什么我不想在UI线程中运行它的原因。现在,我想将此列表返回到我的main方法。做这个的最好方式是什么?
这个线程完成后,有没有办法让我传递"r"的值?我相信我在9或10个月之前在另一个项目上做过这个但是对于我而言,我不记得找到代码的项目了.我花了大约5个小时来挖掘代码和谷歌搜索,但是由于我不经常在Java\Android中开发,所以我已经完全放弃了我的想法.
下面是我的代码,以及我上次做这个时的记忆.我有点记得".call()"或".get()",但试图在android文档中找到一些东西.我不确定.我只能找到"可赎回".
public void updateUserProfile(){
if(checkFields(){
//Do Something
}else{
//Do Something
}
}
public boolean checkFields(){
Boolean r = false;
Runnable run = new Runnable(){
//Boolean r;
@Override
public void run() {
//Or boolean r;
//get value of r.
r = php.UpdateProfile.updateProfile(user_id, user_email);
}
};
new Thread(run).start();
return r; //run.get(r)?
}
Run Code Online (Sandbox Code Playgroud)