线程通信的练习

在集合框架中,最高级别的抽象一共有两个:Collection,Map

Collection一共有三个常用字接口:List Set Qieue

队列的入队与出队

add    入队,当队列满了会抛异常

offer  入队,当队列满了会返回false

put  入队。当队列为空线程会进入阻塞状态(只有在类型为BlockingQueue是才会使用,Queue无法使用)

remove    出队,当队列为空是会抛出异常

poll  吹对,当队列为空是会返回null

take 出队,当队列为空时,进入阻塞状态(只有在类型为BloingQueue时才会使用。Queue无法使用)

peek    不出队,只取出队列中的第一个元素

public class QueuePractice {
    public static void main(String[] args) {
        // Queue对象的创建
        // 创建一个先入先出的队列
        // Queue<String> queue = new LinkedList<>();

        // 创建一个容量为3的队列
        Queue<String> queue = new ArrayBlockingQueue<>(2);

        // 入队
        // 不管是add,还是offer,添加失败,返回都是false
        // 当队列满了,再添加,会抛异常
        //queue.add("one");
        //queue.add("two");
        //queue.add("three");

        // 当队列满了,再添加,不抛异常,而是添加失败
        //queue.offer("1");
        //queue.offer("2");
        //queue.offer("3");

        // 出队
        // 把队列最开头的元素取出,但是不出列
        //String peek = queue.peek();

        // 把队列最开头的元素取出,并且出列
        // 当队列为空,会抛异常
        String remove = queue.remove();

        // 当队列为空,取出null,不会抛异常
        //String poll = queue.poll();

        System.out.println(queue);
        //System.out.println(peek);
        //System.out.println(poll);
        System.out.println(remove);
    }

}

高级多线程

线程池

概述

在系统中,通过new关键字,创建出的线程对象(Thread对象,而不是Runnable对象),创建好了之后,只能启动一次

通过new关键字,创建出的线程对象,每个大约占用内存1MB左右,假设内存指定2GB大小,那么只能创建2048个线程。极易造成内存溢出

虽然JVM有自带的垃圾回收机制,但是频繁地创建与销毁线程,也是会耗费系统资源的

池化机制是提前将一定数量的资源准备好,进而去使用,当使用结束之后,不会销毁此资源,而是将此资源重新标志为未使用,就可以为其他的使用资源的线程去使用

池化机制是为了重复使用某些系统资源而引入的一种技术

API

  • Executors.newFixedThreadPool(线程数量)

    创建一个线程池对象

  • threadPool.submit(runnable)

    通过线程池,调度线程任务

  • threadPool.shutdown()

    标记线程池不再继续使用了 再次往内部放入线程任务,会抛异常 等待线程池内部的所有线程任务,执行结束,线程池才会关闭掉

  • threadPool.shutdownNow()

    立即销毁线程池 进而会销毁线程池内部正在执行的所有任务

    常见的线程池有哪些

  • FixedThreadPool

  • CachedThreadPool

  • ScheduledThreadPool

  • 带返回值的线程任务

  • Callabl接口,因为Runna接口没有返回值,所以必须要用有返回值的Callab,此类型的返回值为object类需要搭配Future类型
  • Future 未来的 即一个线程任务在执行一段时间才会在将来出现结果
  • 所以在使用线程池的时候可以为submit准备一个Callble对象,但在subimt之后不会产生任何堵塞
  • 假如submit方法 填入的是Callable类型的对象,会返回一个Future类型的值
  • 这个对象不会产生阻塞,但在调用这个对象的get方法是,会产生阻塞    
  • public class BlockingQueuePractice {
        public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutException {
      ExecutorService threadpool=Executors.newFixedThreadPool(5);
            Callable<String> callable = new Callable<String>() {
                @Override
                public String call() throws Exception {
                    StringBuilder stu=new StringBuilder();
                    Thread.sleep(500);
                    stu.append("one");
                    System.out.println("第一次输入");
                    Thread.sleep(500);
                    stu.append("two");
                    System.out.println("第二次输入");
                    return stu.toString();
                }
            };
            Future<String>futureTask=threadpool.submit(callable);
            String futureResult=futureTask.get(2,TimeUnit.DAYS);
            System.out.println(futureResult);
            threadpool.shutdown();
        }
    
    
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值