FutureTask: FutureTask一个可取消的异步计算,FutureTask 实现了Future的基本方法,提 供 start cancel 操作,可以查询计算是否已经完成,并且可以获取计算的结果。结果只可以在计算完成之后获取,get方法会阻塞当计算没有完成的时候,一旦计算已经完成,那么计算就不能再次启动或是取消。
FutureTask实现了Runnable接口和Future接口。
Callable接口和Runnable接口相似,区别就是Callable需要实现call方法,而Runnable需要实现run方法;并且, call方法还可以返回任何对象 ,无论是什么对象,JVM都会当作Object来处理。
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
1.corePoolSize:线程池核心线程数(平时保留的线程数)
2.maximumPoolSize:线程池最大线程数(当workQueue都放不下时,启动新线程,最大线程数)
3.keepAliveTime:超出corePoolSize数量的现成的保留时间。
4.unit: keepaliveTime单位
5.workQueue:阻塞队列,存放来不及执行的线程
ArrayblockingQueue:构造函数一定要传大小
LinkedBlockingQueue:构造函数不穿大小会默认为(Integer.MAX_VALUE),当大量请求任务时,荣富易造成内存耗尽。
SynchronousQueue:同步队列,一个没有存储空间的阻塞队列 ,将任务同步交付给工作线程。
PriorityBlockingQueue : 优先队列
6.theadFactory:线程工厂
7. handler:饱和策略
AbortPolicy(默认):直接抛弃
CallerRunsPolicy:用调用者的线程执行任务
DiscardOldestPolicy:抛弃队列中最久的任务
DiscardPolicy:抛弃当前任务
1.变量可见性:保证该变量对所有线程可见,这里的可见指的是当一个线程修改了变量的值,那么新的值对于其他线程是可以立即获取的。
2.禁止重排序:volatile禁止了指令重排。比sychronized更轻量级的同步锁。在访问volatile 变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比sychronized关键字更轻量级的同步机制。volatile适合这种场景:一个变量被多个线程共享,线程直接给这个变量赋值。
java提供了关键字synchronized,这是java语言提供的多线程互斥的一种机制。synchronized可以作为函数的修饰符,也可以作为函数内的语句块的修饰符,可以修饰static方法。
1.修饰函数
一、synchronized作函数修饰符public synchronized void fun()
{
// write code here.
}
2.synchronized同步程序块
public void fun_1(someObject obj)
{
synchronized(obj)
{
//code here
}
这个模拟程序一共分为三个时间,烧开水,洗茶杯,泡茶 烧开水的时候可以洗茶杯 必须烧完开水,洗完茶杯以后才能开始泡茶 import java.util.Date; public class Tea implements Runnable{ static Date date = new Date(); public static void main(String[] args) throws Exception{ HeatUpWater h1 = new HeatUpWater(); WashCup w1 = new WashCup(); Tea m1 = new Tea(); Thread t1 = new Thread(h1); Thread t2 = new Thread(w1); Thread t3 = new Thread(m1); try{ t1.start(); t2.start(); t2.join(); t1.join(); }catch (Exception e){ System.out.println("Error!"); } t3.start(); } public void run(){ System.out.println(date+" 正在泡茶"); try{ Thread.sleep(1000); }catch (Exception e){ } } } class HeatUpWater implements Runnable{ static Date date = new Date(); public void run(){ int time = 10; while(time != 0){ System.out.println(date+" 正在烧水"); time--; try{ Thread.sleep(1000); }catch (Exception e){ System.out.println("Heat up water is in the Error!"); } } } } class WashCup implements Runnable{ static Date date = new Date(); public void run(){ int time = 5; while(time != 0){ System.out.println(date+" 正在洗茶杯"); time--; try{ Thread.sleep(1000); }catch (Exception e){ } } } }