Java核心篇之多线程---day1

Java面试之多线程—day1

一. 线程中sleep方法与wait方法有什么区别?

  1. 对于 sleep()方法,我们首先要知道该方法是属于 Thread 类中的。而 wait()方法,则是属于Object 类中的

  2. 在调用 sleep()方法的过程中, 线程不会释放对象锁。而当调用 wait()方法的时候,线程会放弃对象锁,进入与该对象相关的等待池中,只有针对此对象当等待时间到了的时候,或者调用 notify()方法后才会返回对象锁

二. Java中线程的实现方式?同步的方式?
继承thread类,实现runnable接口,通过callable和future来实现(call方法有返回值和声明异常),使用线程池例如executor框架来实现

三. 同步锁与死锁

  1. 同步锁:当多个线程同时访问同一个数据时,很容易出现问题。为了避免这种情况出现,我们要保证线程
    同步互斥,就是指并发执行的多个线程,在同一时间内只允许一个线程访问共享数据。 Java 中可
    以使用 synchronized 关键字来取得一个对象的同步锁。

  2. 死锁:何为死锁,就是多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。

  3. 线程池的原理:
    线程池做的工作主要是控制运行的线程的数量,处理过程中将任务放入队列,然后在线程创建后
    启动这些任务,如果线程数量超过了最大数量超出数量的线程排队等候,等其它线程执行完毕,
    再从队列中取出任务来执行。 他的主要特点为: 线程复用; 控制最大并发数; 管理线程。

  4. 线程池的组成:
    一个线程池主要有四个方面组成:
    1. 线程池管理器:用于创建并管理线程池
    2. 工作线程:线程池中的线程
    3. 任务接口:每个任务必须实现的接口,用于工作线程调度其运行
    4. 任务队列:用于存放待处理的任务,提供一种缓冲机制

在这里插入图片描述

	1. **corePoolSize:指定了线程池中的线程数量。**2. **maximumPoolSize:指定了线程池中的最大线程数量。**3. **keepAliveTime:当前线程池数量超过 corePoolSize 时,多余的空闲线程的存活时间,即多

少时间内会被销毁。**
4. unit: keepAliveTime 的单位。
5. workQueue:任务队列,被提交但尚未被执行的任务。
6. threadFactory:线程工厂,用于创建线程,一般用默认的即可。
7. handler:拒绝策略,当任务太多来不及处理,如何拒绝任务。

  1. 拒绝策略:

线程池中的线程已经用完了,无法继续为新任务服务,同时,等待队列也已经排满了,再也
塞不下新任务了。这时候我们就需要拒绝策略机制合理的处理这个问题。
JDK 内置的拒绝策略如下:
1. AbortPolicy直接抛出异常,阻止系统正常运行。
2. CallerRunsPolicy : 只要线程池未关闭,该策略直接在调用者线程中,运行当前被丢弃的
任务。显然这样做不会真的丢弃任务,但是,任务提交线程的性能极有可能会急剧下降。
3. DiscardOldestPolicy丢弃最老的一个请求,也就是即将被执行的一个任务,并尝试再
次提交当前任务。

4. DiscardPolicy该策略默默地丢弃无法处理的任务,不予任何处理。如果允许任务丢
失,这是最好的一种方案。

以上内置拒绝策略均实现了 RejectedExecutionHandler 接口,若以上策略仍无法满足实际
需要,完全可以自己扩展 RejectedExecutionHandler 接口。

6. Java线程池的工作原理:
1. 线程池刚创建时,里面没有一个线程。任务队列是作为参数传进来的。不过,就算队列里面
有任务,线程池也不会马上执行它们。
2. 当调用 execute() 方法添加一个任务时,线程池会做如下判断:
a) 如果正在运行的线程数量小于 corePoolSize,那么马上创建线程运行这个任务;
b) 如果正在运行的线程数量大于或等于 corePoolSize,那么将这个任务放入队列;
c) 如果这时候队列满了,而且正在运行的线程数量小于 maximumPoolSize,那么还是要
创建非核心线程立刻运行这个任务;
d) 如果队列满了,而且正在运行的线程数量大于或等于 maximumPoolSize,那么线程池
会抛出异常 RejectExecutionException。
3. 当一个线程完成任务时,它会从队列中取下一个任务来执行。
4. 当一个线程无事可做,超过一定的时间( keepAliveTime)时,线程池会判断,如果当前运
行的线程数大于 corePoolSize,那么这个线程就被停掉。所以线程池的所有任务完成后,它
最终会收缩到 corePoolSize 的大小。

  1. 线程与进程的区别:
    在这里插入图片描述

  2. 线程的生命周期(状态)
    1. 新建(new):当程序使用 new 关键字创建了一个线程之后,该线程就处于新建状态,此时仅由 JVM 为其分配
    内存,并初始化其成员变量的值.
    2. 就绪(runnable):当线程对象调用了 start()方法之后,该线程处于就绪状态。 Java 虚拟机会为其创建方法调用栈和
    程序计数器,等待调度运行。
    3. 运行(running):如果处于就绪状态的线程获得了 CPU,开始执行 run()方法的线程执行体,则该线程处于运行状

    4. 阻塞(blocked):阻塞状态是指线程因为某种原因放弃了 cpu 使用权,也即让出了 cpu timeslice,暂时停止运行。
    直到线程进入阻塞(runnable)状态,才有机会再次获得 cpu timeslice 转到运行(running)状
    态。阻塞的情况分三种:
    在这里插入图片描述
    5. 死亡(dead):线程会以下面三种方式结束,结束后就是死亡状态。
    在这里插入图片描述
    在这里插入图片描述

  3. start方法和run方法的区别:
    1)。 调用start方法来启动多线程,这时候蔡真正的实现多线程运行,这时无需等待run方法执行完毕就可以直接继续执行下面的代码,这个时候线程是处于就绪(runnable) 状态。
    2)。run方法称为线程体,调用run方法的时候,线程进入运行态,当run方法执行完毕时,线程就结束了。

  4. 守护线程
    守护线程也叫“服务线程”,为用户提供公共服务,在没有用户可提供的时候会自动离开。守护线程的优先级比较低。
    垃圾回收线程就是一个经典的守护线程,当我们程序中不在有其他任何运行的线程时,程序就不会产生垃圾,垃圾回收器也就无事可做,垃圾回收器就会自动离开。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558889.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode算法入门- Longest Substring Without Repeating Characters-day4

LeetCode算法入门- Longest Substring Without Repeating Characters-day4 Longest Substring Without Repeating Characters Given a string, find the length of the longest substring without repeating characters. Example 1: Input: “abcabcbb” Output: 3 Explana…

Java 多线程 —— 常用并发容器

引言 本博客基于常用的并发容器,简单概括其基本特性和简单使用,并不涉及较深层次的原理分析和全面的场景用法。 适合对不了解并发容器的同学,工作中遇到类似的场景,能够对文中提到的并发容器留有简单印象就好。 一、Concurrent…

LeetCode算法入门- Longest Palindromic Substring-day5

LeetCode算法入门- Longest Palindromic Substring-day5 Longest Palindromic Substring Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000. Example 1: Input: “babad” Output: “bab” Note: “a…

Tomcat运行三种模式:http-bio|http-nio|http-apr介绍

转自《tomcat运行三种模式:http-bio|http-nio|http-apr介绍》 Tomcat是一个小型的轻量级应用服务器,也是JavaEE开发人员最常用的服务器之一。不过,许多开发人员不知道的是,Tomcat Connector(Tomcat连接器)有bio、nio、apr三种运行模式&#…

LeetCode算法入门- Reverse Integer-day6

LeetCode算法入门- Reverse Integer-day6 Given a 32-bit signed integer, reverse digits of an integer. Example 1: Input: 123 Output: 321 Example 2: Input: -123 Output: -321 Example 3: Input: 120 Output: 21 class Solution {public int reverse(int x) {long…

Java工具方法——属性拷贝方法:BeanUtils.copyProperties(Object, Object)

介绍 org.springframework.beans.BeanUtils.copyProperties(Object, Object)是spring 框架的对象工具类:BeanUtils下的一个拷贝对象属性的方法。 官方注释 把给定的源对象属性值拷贝到目标对象中。 注意:源对象类与目标对象类不一定非要完全匹配&…

LeetCode算法入门- String to Integer (atoi)-day7

LeetCode算法入门- String to Integer (atoi)-day7 String to Integer (atoi): Implement atoi which converts a string to an integer. The function first discards as many whitespace characters as necessary until the first non-whitespace character is found. The…

LeetCode算法入门- Roman to Integer Integer to Roman -day8

LeetCode算法入门- Roman to Integer -day8 Roman to Integer: 题目描述: Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M. Symbol    Value I        1 V        5 X        10 L…

Git初学札记(九)————EGit检出远程分支

引言 现在有这样一个使用场景:团队中的其他开发者提交了一个新的特性分支(如feature_1),要求我们一同开发,并将自己修改的代码也全部提交到这个分支上去。那么如何将这个分支检出,并将本地检出的分支与这个…

LeetCode算法入门- 3Sum -day9

LeetCode算法入门- 3Sum -day9 题目描述: Given an array nums of n integers, are there elements a, b, c in nums such that a b c 0? Find all unique triplets in the array which gives the sum of zero. Note: The solution set must not contain dup…

XML学习(一)————XML简介

引言 作为数据传输界鼎鼎大名的扛把子,XML被应用于各个方面,但随着弱结构化标记语言如JSON、YAML等的出现,人们慢慢的脱离了XML的统治,但在互联网早期的发展当中XML是不可或缺的一部分,比如各种微信开发中的数据传输&…

Java核心篇之Java锁--day2

Java核心篇之Java锁–day2 乐观锁:乐观锁是一种乐观思想,即认为读多写少,每次去取数据的时候都认为其他人不会修改,所以不会上锁;但是在更新的时候会判断一下在此期间别人有没有去修改它,如果有人修改的话…

XML学习(二)————属性还是标签?

引言 xml中并没有规则要求我们什么时候使用属性,什么时候使用标签。 属性和标签都可以存储数据,但是在XML的使用中,我们需要探讨一下对属性和标签的选择问题。 约定规则 XML 应该避免使用属性来存储数据,这与HTML的推荐规则不…

LeetCode算法入门- 3Sum Closest -day10

LeetCode算法入门- 3Sum Closest -day10 Given an array nums of n integers and an integer target, find three integers in nums such that the sum is closest to target. Return the sum of the three integers. You may assume that each input would have exactly one …

Spring Boot————Web应用启动时自动执行ApplicationListener用法

原文:《web服务启动spring自动执行ApplicationListener的用法》 引言 我们知道,一般来说一个项目启动时需要加载或者执行一些特殊的任务来初始化系统,通常的做法就是用servlet去初始化,但是servlet在使用Spring bean时不能直接注…

LeetCode算法入门- 4Sum -day11

LeetCode算法入门- 4Sum -day11 Given an array nums of n integers and an integer target, are there elements a, b, c, and d in nums such that a b c d target? Find all unique quadruplets in the array which gives the sum of target. Note: The solution se…

Spring Boot————ApplicationListener实现逃课事件监听

引言 上一篇文章转了一篇关于ApplicationListener用于在Web项目启动时做一些初始化的用法。 但是,在实际生产过程中,当一个事件产生,又是如何被onApplicationEvent()方法监听到,并执行一系列动作呢?简单搜索了一下&a…

Java核心篇之Redis--day4

Java核心篇之Redis–day4 Redis有哪些数据结构? 字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。 1.String:字符串,常用命令:get,set,decr,incr,mget(查…

软件版本GA、RC、beta等含义

原文《软件版本GA、RC、beta等含义》 GA General Availability,正式发布的版本,官方开始推荐广泛使用,国外有的用GA来表示release版本。 RELEASE 正式发布版,官方推荐使用的版本,有的用GA来表示。比如spring。 Sta…

Java核心篇之泛型--day5

Java核心篇之泛型–day5 泛型是JDK5时引入的一个新特性,泛型提供了编译时类型安全检查的机制,该机制允许程序猿在编译时检测到非法的类型输入。 泛型的本质是参数化类型,也就是说操作的类型被指定为一个参数。 假定我们有一个需求&#xff…