java 子线程如何返回结果给主线程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 子线程如何返回结果给主线程相关的知识,希望对你有一定的参考价值。

我在主线程里的run()调用的函数里有开了一个线程,但现在我需要等子线程运行到一定程度(比如i=0,i++到100),子线程结束的同时,主线程也要结束。期间,主线程也在运行另外一个程序,不能单纯让主线程等待子线程结束。。
刚接触JAVA不久,这种情况我该怎么处理,创建线程是用 implements Runnable()这种.

可以的 你的主线程和子线程 synchronized 一个boolean变量(flag)
当子线程到达一定条件是将其设置成false;
而主线程run()做这样的设置 while(flag)
这样主线程就会结束了~~
其实有直接关闭线程的方法 但是不建议这么做~~
防止出现死锁.追问

我原先也是这么做的 不过不知道为什么 主线程停不下来
大体结构是这样的:
public boolean flag =true;
class mainThread ....
run()while(flag)调用函数A;
A函数
while(..)
if(循环第一次的时候)new subThread;

class subThread
run()
while(...)... if(num==100) flag=false;

追答

public class MyThreadTest

public static void main(String[] args)

MainThread mainThread=new MainThread();
mainThread.start();




class MainThread extends Thread
protected static boolean flag = true;
public void run()
super.run();
SubThread subThread=new SubThread();
subThread.start();
while (flag)
System.out.println("主线程run!");



class SubThread extends MainThread
private int i=0;
private boolean subFlag=true;
public void run()
while(subFlag)
System.out.println("子线程run! "+i);
i+=1;
if(i==100)
flag=false;
subFlag=false;




贴下我的代码吧 这个基本符合你的想法 (运行也正常)
你看看 你哪里不明白....咱们再一起解决问题
(CSDN的账号 被洗 考 密码居然明文保存...)
楼上的写法也可以...
其实观察者设计模式最好...

追问

我的情况还挺复杂的,我的子线程需要从主线程传递参数进来,而参数是在主线程的while里生成的。我的子线程是怎么构造的:
MyThread test = new MyThread(pd, FolderNameOfPC, piece,imgUrls);
Thread search = new Thread(test);
search.start();
而且我的子线程好像得在while里构造吧, 不然传递进来的参数就是为空的。我的主线程是implements Runnable 刚接触JAVA不久,很多不懂,麻烦了

参考技术A 试试用观察者,把主线程注册为子线程的观察者,子线程结束时,去关闭其观察者线程。 参考技术B 你看一下,这个能不能满足你的要求。

public class TS

public static void main(String[] args)
RunA classA = new RunA();
new Thread(classA).start();



class RunA implements Runnable
public void run()
RunB classb = new RunB();
new Thread(classb).start();
while (true)
if (classb.index == 100)
System.out.println("over");
break;

try
Thread.sleep(20);
catch (Exception e)






class RunB implements Runnable
public int index = 0;

public void run()
while (true)
if (index == 100)
break;

index++;
try
Thread.sleep(20);
catch (Exception e)




QT多线程问题:子线程中的变量如何传递给主线程?

本人初学QT,菜鸟一只。
在QT多线程编程中,如何将子线程中的某个变量中的值传递给主线程?比如,我要一个子线程不停读取一个串口,主线程在需要的时候提取子线程中读到的数据,应该如何实现?

参考技术A public int _CurrentThread;

//form1_load中的,启动线程的代码在这里。
private void Form1_Load(object sender, EventArgs e)

//设置最大线程数
int MaxThread = 5;

//获取需要完成的任务列表
OleDbConnection AccessConn = AccessModule.Conn("D:\\Flying Co\\flying.mdb");
string sql = "select * from ty_task where bay_flag=" + false + " order by bay_id asc";

OleDbCommand comm = new OleDbCommand(sql, AccessConn);
OleDbDataReader list = comm.ExecuteReader();

while (list.Read())

ContentParse Spider = new ContentParse();

//如果当前活动线程超过最大线程数,线程休眠
if (Spider.CurrentThread> MaxThread)

Thread.Sleep(2000);

else

//init
Spider.Url = list["bay_task"].ToString();

//启动一个线程
Thread SpiderThread = new Thread(new ThreadStart(Spider.execute));
SpiderThread.Start();
MessageBox.Show(Spider.CurrentThread.ToString());

//任务设置为已处理
sql = "update ty_task set bay_flag=" + true + " where bay_id=" + list["bay_id"].ToString();
AccessModule.Execute(AccessConn, sql);



list.Close();
AccessModule.DisConn(AccessConn);


//线程启动的是这个类的方法
class ContentParse

private string _Url;

//设置任务参数
public string Url

set

_task = value;



public void execute()


//活动线程数加1
Interlocked.Increment(ref _CurrentThread);

//中间处理任务的代码省略

//该线程完成,活动线程减1
Interlocked.Decrement(ref _CurrentThread);


我现在纠结的就是这个Interlocked.Increment(ref _CurrentThread);应该是开一个线程就要加1的对吧?
但是我在form1中间用 MessageBox.Show(Spider.CurrentThread.ToString());,总是0噢

以上是关于java 子线程如何返回结果给主线程的主要内容,如果未能解决你的问题,请参考以下文章

android AsyncTask 怎么返回值给UI线程

如何使“主线程”等待“子线程”执行结束后再继续执行

用QT是怎么编写后台线程,我开启了一个耗时的线程,结果界面就卡住,只有等到这个线程执行完才会做其他。

如何使“主线程”等待“子线程”执行结束后再继续执行

JAVA 线程池之Callable返回结果

如何实现java主线程等待子线程执行完毕之后再执行