线程的编程4种实现方法(下)
3、使用Callable和Future接口创建线程
具体是创建Callable接口的实现类,并实现call()方法。并使用FutureTask类来包装Callable实现类的对象,且以此 FutureTask对象作为Thread对象的target来创建线程
接口定义
Callable接口用于定义线程的执行逻辑
@FuntionalInterface //属于函数式接口,所以可以直接使用lambda表达式进行定义
public interface Callable<V>{ //<>写法叫做泛型,用于定义返回的数据类型
V call()throws Exception;
}
Future接口用于Callable接口中call方法的执行结果,并可以测试Callable的执行情况
public interface Future<V>{//用于获取Callable接口中的call方法的执行结果
boolean cancel(boolean mayIntersupteIfRunning);
boolean isCancelled();
boolean isDone();
V get() throws InterruptedException, ExecutionException;
V get(long timeout, TimeUnit unit)throws InterruptedException, ExecutionException; }
系统提供了一个Future接口的实现类FutureTask
public class FutureTask<V> implements RunnableFuture<V> //这个实现类实现了两个接口Runnable和 Future
使用方法:
1.定义Callable接口实现类
public class MyCallable implements Callable<Integer>{
int begin=0;
int end=0;
public MyCallable(int begin, int end){
this.begin=begin;
this.end=end;
}
public Integer call()throws Exception{
int res=0;
for(int k=begin; k<=end; k++)
res+=k;
System.out.println(Thread.currentThread()+"---"+res);
return res;
}
}```
2.调用
```java
FutureTask[] arr=new FutureTask[10];
for(int i=0;i<10;i++){
arr[i]=new FutureTask<>(new MyCallable(i*10+1,(i+1)*10));
Thread t=new Thread(arr[i]);
t.start();
}
int res=0;
for(int i=0;i<arr.length;i++)
res+=((Integer)arr[i].get());
System.out.println("计算结果为:"+res);
**注意:**FutureTask实现了Future和Runnable接口,所以new Thread(futureTask),当执行thread.start()方法时会自 动调用Callable接口实现中的call方法。当调用futureTask.get()方法时可以获取对应的线程对象的执行结果,如果 线程并没有返回时,当前线程阻塞等待。
4、使用线程池创建线程
享元模式
享元模式Flyweight Pattern主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于 结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式
**优点:**大大减少对象的创建,降低系统内存的使用,以提高程序的执行效率。
**缺点:**提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部 状态的变化而变化,否则会造成系统的混乱。
不考虑线程问题
public interface IShape {
void draw();
}
public class Circle implements IShape {
public void draw() {
System.out.println("我画一个圆");
}
}