java基本知识(一)

线程

1、在集合框架中,有些类是线程安全的。

  • vector:比arraylist多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用。在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的。
  • tatck:堆栈类,先进后出
  • hashtable:就比hashmap多了个线程安全
  • enumeration:枚举,相当于迭代器

2、实现线程两种方法以及区别。

  • 通过继承Thread类方式实现。
  • 通过实现Runnable接口方式实现。

两种方法都需要通过Thread类的实例调用start()方法来开始线程的执行,start()方法通过java虚拟机调用线程中定义的run方法来执行该线程。

区别:

因为java的单继承特性,如果用继承Thread类的方式来实现多线程的话,此线程类就不能继承其他的类了。所以在程序中往往要求用实现Runnable的方式来开发会更好。第二也是最重要的一点就是,通过实现Runnable接口的方式可以达到资源共享的效果。

3、线程安全关键字synchronized

可以修饰函数、函数内语句。无论它加上方法还是对象上,它取得的锁都是对象,而不是把一段代码或是函数当作锁。从而保证一段时间只能有一个线程得到执行,而另一个线程只有等当前线程执行完以后才能执行这块代码。

4、线程池

如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。Java中可以通过线程池使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务。

其核心的ThreadPoolExecutor类中有几个参数如下:

    • corePoolSize:核心池的大小,这个参数跟线程池的实现原理有非常大的关系。
    • maximumPoolSize:线程池最大线程数,这个参数也是一个非常重要的参数,它表示在线程池中最多能创建多少个线程;
    • keepAliveTime:表示线程没有任务执行时最多保持多久时间会终止。

处理线程池的四点:

    • 如果当前线程池中的线程数目小于corePoolSize,则每来一个任务,就会创建一个线程去执行这个任务;
    • 如果当前线程池中的线程数目>=corePoolSize,则每来一个任务,会尝试将其添加到任务缓存队列当中,若添加成功,则该任务会等待空闲线程将其取出去执行;若添加失败(一般来说是任务缓存队列已满),则会尝试创建新的线程去执行这个任务;
    • 如果当前线程池中的线程数目达到maximumPoolSize,则会采取任务拒绝策略进行处理;
    • 如果线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止,直至线程池中的线程数目不大于corePoolSize;如果允许为核心池中的线程设置存活时间,那么核心池中的线程空闲时间超过keepAliveTime,线程也会被终止。

ThreadPoolExecutor提供了两个方法,用于线程池的关闭,分别是shutdown()(不会立即终止线程池,而是要等所有任务缓存队列中的任务都执行完后才终止,但再也不会接受新的任务)和shutdownNow()(立即终止线程池,并尝试打断正在执行的任务,并且清空任务缓存队列,返回尚未执行的任务)。

ThreadPoolExecutor提供了动态调整线程池容量大小的方法:setCorePoolSize()和setMaximumPoolSize()。

在ThreadPoolExecutor类中有两个非常重要的方法:

1、execute()
是Executor中声明的方法,在ThreadPoolExecutor进行了具体的实现,这个方法是ThreadPoolExecutor的核心
方法,通过这个方法可以向线程池提交一个任务,交由线程池去执行。
2、submit()
在ExecutorService中声明的方法,在AbstractExecutorService就已经有了具体的实现,在
ThreadPoolExecutor中并没有对其进行重写,这个方法也是用来向线程池提交任务的,但是它和execute()方
法不同,它能够返回任务执行的结果。



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值