关于编程的那些事-7

2021/11/7 17:15:38

本文主要是介绍关于编程的那些事-7,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一.FutureT类有什么作用?它实现了那些接口?Callable接口和Runnable接口有什么不同?

 FutureTask: FutureTask一个可取消的异步计算,FutureTask 实现了Future的基本方法,提 供 start cancel 操作,可以查询计算是否已经完成,并且可以获取计算的结果。结果只可以在计算完成之后获取,get方法会阻塞当计算没有完成的时候,一旦计算已经完成,那么计算就不能再次启动或是取消。

FutureTask实现了Runnable接口和Future接口。

Callable接口和Runnable接口相似,区别就是Callable需要实现call方法,而Runnable需要实现run方法;并且, call方法还可以返回任何对象 ,无论是什么对象,JVM都会当作Object来处理。

二.请查阅JDK自学线程池的相关类,如ThreadPoolExecutor构造七各个参数的意义,利用线程池编写多线程程序。

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:抛弃当前任务

三.volatile关键字有什么作用?

        1.变量可见性:保证该变量对所有线程可见,这里的可见指的是当一个线程修改了变量的值,那么新的值对于其他线程是可以立即获取的。

        2.禁止重排序:volatile禁止了指令重排。比sychronized更轻量级的同步锁。在访问volatile 变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比sychronized关键字更轻量级的同步机制。volatile适合这种场景:一个变量被多个线程共享,线程直接给这个变量赋值。

四.java提供了哪些同步机制来实现互斥?

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
  }

五.编写java程序模拟烧水泡茶最优工序。

这个模拟程序一共分为三个时间,烧开水,洗茶杯,泡茶
烧开水的时候可以洗茶杯
必须烧完开水,洗完茶杯以后才能开始泡茶

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){

            }
        }

    }
}



这篇关于关于编程的那些事-7的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程