Callable创建多线程:
实现Callable接口的方式创建多线程要比实现Runnable接口创建多线程方式更加强大。首先重写的call()方法中是可以有返回值的,其次,call()方法可以抛出异常,被外面的操作捕获到,从而获取到异常信息。最后Callable是支持泛型的。
class Callabel1 implements Callable{
@Override
public Object call() throws Exception {
//遍历100以内的所有偶数,并返回他们的和
int sum = 0;
for(int i = 1; i <=100; i++){
if(i % 2 == 0){
System.out.println(i);
sum += i;
}
}
return sum;//自动装箱
}
}
public class CallableTest {
public static void main(String[] args) {
Callabel1 c1 = new Callabel1();
FutureTask futureTask = new FutureTask(c1);
new Thread(futureTask).start();
try {
Object sum = futureTask.get(); //获取Callable中call方法的返回值
System.out.println(sum);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
使用线程池创建线程:
1.提高响应速度(减少了创建新线程的时间)2.降低资源消耗(重复利用线程池中线程,不需要每次都创建)3.便于线程管理。
class NumberThread implements Runnable{
@Override
public void run() {
for (int i = 1; i <100 ; i++) {
if(i%2 ==0){
System.out.println(Thread.currentThread().getName()+"这是偶数分隔符"+i);
}
}
}
}
class NumberThread1 implements Runnable{
@Override
public void run() {
for (int i = 1; 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(5);
System.out.println(service.getClass()); //可以找出ExecutorService接口的实现类,从而创建实现类对象,调用其方法
ThreadPoolExecutor service1 = (ThreadPoolExecutor) service;
service1.setCorePoolSize(10); //修改线程池大小
service.execute(new NumberThread());
service.execute(new NumberThread1());
service.shutdown(); //关闭连接池
}
}