补充两个创建线程的方式
面试题: 创建线程有几个方式? 四个四个四个!!!
- 创建线程的方式三:实现Callable接口 ————JDK5.0新增
- 如何理解实现Callable接口的方式创建多线程比实现Runanable接口创建多线程方式强大
- 1.call()可以有返回值
- 2.call()可以抛出异常,被外面的操作捕获
- 3.callable是支持泛型的
- 方式四:用线程池的方式来创建多线程
- 好处:
- 1提高响应速度(减少了创建新线程的时间)
- 2降低了资源消耗(重复利用线程池的线程,不需要每次都创建)
- 3便于管理
- corePoolSize;核心池的大小
- maximumPoolSize 最大线程数
- keepAliveTime 线程没有任务时候最多保持多长时间会终止
第三种创建线程的方法的源代码
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
//1创建一个实现Callable接口的实现类
class callables implements Callable{
//2实现call方法,将此线程需要的执行的操作声明在call()中
@Override
public Object call() throws Exception {
int sum=0;
for (int i = 0; i <100;i++) {
if (i%2==0) {
System.out.println(i);
sum+=i;}
}
return sum;
}}
public class CallableTest {
public static void main(String[] args) {
//3创建Callable接口对象
callables a1=new callables();
//4j将此Callable接口实现类传递到FutureTask构造器中,创建FutureTask对象
FutureTask F1 =new FutureTask(a1);
//5将FutureTask对象作为参数传递到Thread类构造器中创建对象, 以便于执行线程
Thread T1 = new Thread(F1);
T1.start();
try {
//6获取Callable中call的返回值
//get()返回值即为FutureTask狗仔参数Callable实现重写call()的返回值
Object sum= F1.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();}
}}
方式三输出结果
方式四的源代码
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
class Number implements Runnable{
@Override
public void run() {
for (int i = 0; i <=100; i++) {
if (i%2==0) {
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
}
class Number1 implements Runnable{
@Override
public void run() {
for (int i = 0; i <=100; i++) {
if (i%2==0) {
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
}
public class ThreadPool {
public static void main(String[] args) {
ExecutorService service= Executors.newFixedThreadPool(10);
service.execute(new Number());
service.execute(new Number1());
service.shutdown();
}
}
方式四输出结果