java知识点 死锁 等待 生产者 消费者 线程池

死锁  就是在执行过程中 都遇到了对方进入加锁的方法中 从而导致大家都访问不了的状态
  原理 
     某一个线程 执行完成 需要先后嵌套锁定 执行两个对象 并且在这个过程中 先锁定第一个对象
     另一个线程 执行完成 需要先后嵌套锁定 执行两个对象 并且在这个过程中 先锁定第二个对象
     在第一个线程执行到第二个对象的时候  发现已经被锁定 只能等待
     当第二个线程执行到第一个对象的时候 发现已经被锁定 只能等待 

线程通信

wait 让该线程进入等待状态  会释放持有的加锁 
       无参或传入0时  表示一直等待   不会自动唤醒 只能等待 notify唤醒他
       也可以传入long类型的值 类似于sleep 时间到了自己唤醒
       
  notify  随机唤醒一个该对象中正在等待的一个线程
  notifyAll  唤醒在该对象中的所有线程
  以上方法只能用在加锁的成员方法中

单例模式  让某个类只实例化一个对象 
  构造方法私有化  静态变量保存对象  公共的静态方法用于获取类对象
  饿汉模式在多线程环境下没有问题  因为不管多少线程 类只能被加载一次 所以只会被初始化一次   也就意味着只能创建一个对象

饿汉模式 在多线程环境下没有问题 因为不管多少线程 类只能被加载一次 所以只会被初始化一次 也就意味着只能创建一个对象

volatile : 为什么使用volatile呢? 防止指令重排
	 * 
	 */
	private volatile static Thread_05_SingLeton singLeton = null;

	/**效率低,因为每次都需要排队
	 public synchronized static Thread_05_SingLeton getInstance() {
	 if (singLeton == null) {
	 singLeton = new Thread_05_SingLeton();
	 }
	 return singLeton;
	 }
	效率较高,因为只需要第一次排队
	*/

 

线程池的作用:

 线程池作用就是限制系统中执行线程的数量。
 根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;

 少了浪费了系统资源,多了造成系统拥挤效率不高。

 用线程池控制线程数量,其他线程排 队等候。

 一个任务执行完毕,再从队列的中取最前面的任务开始执行。

 若队列中没有等待进程,线程池的这一资源处于等待。

 当一个新任务需要运行时,如果线程池 中有等待的工作线程,就可以开始运行了;

 否则进入等待队列。

 为什么要用线程池:

 减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。

 可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)

 创建一个固定长度线程池,可控制线程最大并发数,
  超出的线程会在队列中等待。(固定数量的线程池)

创建一个固定长度线程池,支持定时及周期性任务执行。(定时线程池)

// 创建池子 并指定长度5
		ScheduledExecutorService scheduledThreadPool = Executors
				.newScheduledThreadPool(5);
		// 1 线程对象 , 2 延迟初始化(延迟执行) , 3 计时单位SECONDS(秒)
		scheduledThreadPool.schedule(new Runnable() {

			@Override
			public void run() {
				System.out.println("delay 3 seconds");
			}
		}, 3, TimeUnit.SECONDS);
		// 如果不关闭池子,就算执行完,也会一直等待
		scheduledThreadPool.shutdown();
	}

	public static void work2() {
		ScheduledExecutorService scheduledThreadPool = Executors
				.newScheduledThreadPool(5);
		// 1 线程对象 , 2 初始化延迟(延迟执行), 3 间隔时间 , 4 计时单位SECONDS(秒)
		scheduledThreadPool.scheduleAtFixedRate(new Runnable() {

单线程化线程池(newSingleThreadExecutor)的优点,串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。
  此线程池保证所有任务的执行顺序按照任务的提交顺序执行。

 通俗:创建只有一个线程的线程池,且线程的存活时间是无限的;
		// 当该线程正繁忙时,对于新任务会进入阻塞队列中(无界的阻塞队列)
		// 适用:一个任务一个任务执行的场景
		public static void main(String[] args) {
			// 创建池子
			ExecutorService singleThreadExecutor = Executors
					.newSingleThreadExecutor();
			// 一次性创建10个请求
			for (int i = 0; i < 10; i++) {
				final int index = i;
				System.out.println("创建" + index + "次");
				// 只能依次执行
				singleThreadExecutor.execute(new Runnable() {

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值