
可以让线程实现Callable接口,实现call方法,可以把你需要的东西return回去,然后如果是线程池的话可以用Future对象的get()方法来接收这个返回值。但是这样做线程池也只会同步执行一个线程。
多线程/多进程都是通讯或者回调,而不是直接返回结果。这个很容易理解的,因为如果你用返回结果来给一个变量赋值,你就必须等待这个函数结束,你这个程序就阻塞了,这就失去了多线程/多进程防止阻塞的意义了。
通讯可以是事件驱动或者用线程安全的数据结构来传递数据(比如Queue,也可以是消息队列0mq,rabbitMQ之类),回调就是你一个程序执行完成后调用另外一个函数来处理接下来怎么做。
runnable 现成结束不通知,但是 run方法运行到最后一行就算结束了。
Callable 也可是实现通知。
MyCallable task2 = new MyCallable(1);
MyCallable task3 = new MyCallable(2);
MyCallable task1 = new MyCallable(0);
// 创建一个执行任务的服务
ExecutorService es = ExecutorsnewFixedThreadPool(3);
// 提交并执行任务,任务启动时返回了一个Future对象,
// 如果想得到任务执行的结果或者是异常可对这个Future对象进行 *** 作
Future future1 = essubmit(task1);
// 获得第一个任务的结果,如果调用get方法,当前线程会等待任务执行完毕后才往下执行
Systemoutprintln("task1: " + future1get());
Future future2 = essubmit(task2);
// 等待5秒后,再停止第二个任务。因为第二个任务进行的是无限循环
Threadsleep(5000);
Systemoutprintln("task2 cancel: " + future2cancel(true));
// 获取第三个任务的输出,因为执行第三个任务会引起异常
// 所以下面的语句将引起异常的抛出
Future future3 = essubmit(task3);
Systemoutprintln("task3: " + future3get());
如果用多线程的话,相直接获取是没有办法的,因为这个程序是在另一个线程中执行的,当前线程会不等它执行完,就把后面的代码执行掉了
变通的方法,把这个方法执行的结果赋值给一个静态变量,然后读取这个静态变量的值~~~
如果有多个值,你可以把这些值放到一到静态的数组或是hashtable中~~~
其实你这个思路是错误的:
根据你的说明,你是想在每个页面都有去执行这个方法,而且还要获取结果。
1、这个线程和你的当前页面不在同一个线程,当前页面并不知道你这个ThreadTryRequest在别的线程中是什么样的状态,当前页面的代码也不会等你这个这个线程执行完就执行掉了,所以你不可能马上拿到这个线程的值的。
2、你这个应用,明显不该用异步的线程来执行,如果要用同步模式,我不知道你这个是为了什么目的把它放到线程中执行,因为你用同步模式,你想等这个线程的执行结果,等的时间和在页面顺序执行是一样的甚至更多~~~
你可以说一下你的目的是什么吗? 就你的描述来看,你根本没必要用线程。。。
从你的代码来看,你可能是想提高页面打开速度,把执行慢的代码放到线程中执行。。。 如果从这个思路来看是对的,不过光这样可不用,你还得用缓存,把执行结果放到缓存中再由线程或是线程池来维护。。。
总之,在一个页面中执行这么低效率的代码,整个解决方案就有问题。。。
===================================================================
public string ThreadTryRequest(string strUrl, string parm)
{
Thread thrOne = new Thread(thisThreadProc); //创建线程
ThreadParameter parameter = new ThreadParameter(); //实例化ThreadParameter对象,并赋值
parameterStrUrl = strUrlToString();
parameterparm = parmToString();
thrOneStart(parameter); //开启线程
return strState; //返回字符串
}
你想在这里就获取到值 那是获取不到的 return strState; 执行了
thisThreadProc(parameter) 还没执行完了,这个时候strState 还没被赋值,
所以我说你的思路是错误的
你想当时就知道一个线程的执行结果,除非你等~~~ 要不获取不到的~~~
全局变量和你传进线程的变量,类似。都是需要用线程锁来进行同步访问的。
全局变量用到线程里,以前是为了方便,不需要每次将变量传进函数里。因为CreateThread太麻烦,只能传进一个指针。现在用Boost就比较方便,可以传进多个参数。
可以通过实现Callable接口创建一个有返回值的线程,代码如下:
import javautilconcurrent;public class MyThread implements Callable<Integer> {
private int count;
public MyThread(int count) {
thiscount = count;
}
@Override
public Integer call() throws Exception {
// 此处是线程要处理的业务代码,此处实现的是对count变量加1的 *** 作
count += 1;
Threadsleep(1000);
return count;
}
public static void main(String[] args) {
// 创建线程实例
MyThread myThread = new MyThread(1);
// 创建一个大小为10的线程池
ExecutorService executor = ExecutorsnewFixedThreadPool(10);
// 将线程提交到线程池执行
Future<Integer> future = executorsubmit(myThread);
try {
// 调用get方法获取线程执行结果,在线程执行完成前该方法会一直阻塞
Integer result = futureget();
Systemoutprintln(result);
} catch (InterruptedException e) {
eprintStackTrace();
} catch (ExecutionException e) {
eprintStackTrace();
}
// try {
// // 这种写法可以设置线程执行的超时时间,当线程超过指定的时间还未执行完成时会抛出TimeoutException异常
// // 示例中表示线程超过1000毫秒还没执行完就会抛出超时异常
// Integer result = futureget(1000, TimeUnitMILLISECONDS);
// Systemoutprintln(result);
// } catch (InterruptedException e) {
// eprintStackTrace();
// } catch (ExecutionException e) {
// eprintStackTrace();
// } catch (TimeoutException e) {
// eprintStackTrace();
// }
}
}
以上就是关于java 线程中的run()方法无返回值并且不停止,如何得到线程数据全部的内容,包括:java 线程中的run()方法无返回值并且不停止,如何得到线程数据、python threading模块,生成多线程之后,怎么得到线程执行完成后return出的字符串呢、java中怎样得到线程结束的通知等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)