主线程在创建子线程的时候通过构造函数向子线程传值。
子线程向主线程传值我会的有两种方式:
第一种是在主线程创建好并start()方法后,让主线程陷入阻塞状态,等待子线程结束,然后主线程继续运行
第二种是继承Callable接口
//实现Callable接口
import Java.util.concurrent.Callable;
public class Ride implements Callable{
private int x,y;
public Ride(int x,int y)
{
this.x = x;
this.y = y;
}
@Override
public Object call() throws Exception {
return x/y;
}
}
//----------------------------------------------------------------------------------------------------
//使用join方法使主线程阻塞,当子线程运算完后,主线程被唤醒,调用Add的getValue()方法获得结果。
public class Add extends Thread {
private double value;
private double x,y;
public Add(double x,double y)
{
this.x=x;
this.y=y;
}
@Override
public void run() {
add();
}
private void add()
{
value=x+y;
}
public double getValue() {
return value;
}
public void setValue(double value) {
this.value = value;
}
}
//--------主线程
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class ThreadCommunication {
public static void main(String[] args) throws InterruptedException, ExecutionException {
//创建了一个线程对象
Add add = new Add(5,3);
//启动线程
add.start();
try {
//让主线程进入阻塞状态
add.join();
//子线程完成后主线程被唤醒,调用getValue()方法获得子线程计算的值。
System.out.println(add.getValue());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//创建一个线程池
ExecutorService es = Executors.newFixedThreadPool(1);
//创建了线程目标
Ride ride = new Ride(10,2);
//执行线程
Future<Object> future = es.submit(ride);
System.out.println(future.get());
//启动一次顺序关闭,执行以前提交的任务,但不接受新任务
es.shutdown();
}
}