前言
一个进程可以有多个进程完成,每个进程都有一个默认的进程main
每个进程都是由CPU进程调度的,每个进程之间每次都是进行抢占的,所以进程每次在进行时都具有随机性
一、实现Callable接口开启进程
Callable 接口和Runnable是差不多的,两个接口都是用于那些创建对象可能被另一个线程执行的类设计的。但是 Callable 接口有返回值,还可以抛出异常。Runnable则既没有返回值也不可以抛出异常 。
实现Runnable接口方法开启进程的步骤:
1.实现callable接口
2.创建类的测试类,创建对象,开启子线程
二、代码实现
新建两个类去实现两个子线程所实现的要求,利用一个测试类Test开启线程
##1.第一个类
/*
*实现callable接口开启有返回值的子线程
* @author 脱发的小白
*/
import java.util.concurrent.Callable;
public class CallableImpl implements Callable<Object> {
@Override
public Object call() throws Exception {
// TODO Auto-generated method stub
String name = Thread.currentThread().getName();//获取当前的进程名
for(int i=0;i<10;i++) {
System.out.println(name+"在打印"+i);
}
return 3847;//子线程返回值--自动装箱,变成包装类
}
}
##2.第二个类
/*
*实现callable接口开启有返回值的子线程
* @author 脱发的小白
*/
import java.util.concurrent.Callable;
public class CallableImpl2 implements Callable<Object> {
@Override
public Object call() throws Exception {
// TODO Auto-generated method stub
String name = Thread.currentThread().getName();//获取当前的进程名
for(int i=0;i<10;i++) {
System.out.println(name+"在打印"+i);
}
return 3847;//自动装箱,变成包装类
}
}
##3.测试类
/*
*实现callable接口开启有返回值的子线程
* @author 脱发的小白
*/
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class Test {
public static void main(String[] args) throws InterruptedException, ExecutionException {
CallableImpl callableImpl = new CallableImpl();
//FutureTask 类是 Futur接口 的一个实现,FutureTask 实现 Runnable接口
FutureTask<Object> futureTask = new FutureTask<>(callableImpl);//创建FutureTask的对象
Thread thread = new Thread(futureTask);//FutureTask实现了Runnable接口,多态
thread.start();//开启子线程
//获取子线程1的返回值
Object object = futureTask.get();//抛出异常
System.out.println(object);
//开启第二个类的子线程
CallableImpl2 callableImpl2 = new CallableImpl2();
FutureTask<Object> futureTask2 = new FutureTask<>(callableImpl2);
Thread thread2 = new Thread(futureTask2);//FutureTask实现了Runnable接口,多态
thread2.start();
}
}
##4.运行结果显示
总结
- Callable 接口和Runnable都是用于那些创建出来的类用于子线程执行的类
- Callable 既有返回值又可以抛出异常
- FutureTask 类是 Futur接口 的一个实现,FutureTask 实现 Runnable接口
- 获取子线程的返回值要使用实现了Runnable接口的FutureTesk的对象