首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

5G 登上“神坛”,区块链裁员求生!

  • 24-03-05 05:00
  • 2649
  • 9712
blog.csdn.net

640?wx_fmt=gif

640?wx_fmt=jpeg

作者:职业科学实验室&BOSS直聘(ID:bosszhipin),领先的移动互联网招聘APP,为求职者提供快速应聘通道,同时为招聘者提供快速招人通道。

2019新春伊始,金三银四求职招聘旺季如约而至,而且比往年更加汹涌:根据统计,2019年春节后两周,企业人才需求同比增长36%,增幅较2018年提高近5个百分点。


对于求职者来说,可能更加关注:哪些岗位比较热门或者值得去?各行业人才吸引力状况变化如何?城市如何选择?BOSS直聘最新发布的《2019年春招旺季人才趋势报告》中就对此进行了解读。


接下来分享本报告中的一些重点发现。



640?wx_fmt=png

同盟时代:“新职业”的萌芽与崛起



不久前,人力资源和社会保障部初步确定了15个拟发布的新职业,包括:


人工智能工程技术人员、物联网工程技术人员、大数据工程技术人员、云计算工程技术人员、建筑信息模型技术员、电子竞技运营师、电子竞技员、无人机驾驶员、数字化管理师、农业经理人、工业机器人系统操作员、工业机器人系统运维员、物联网安装调试员、城市轨道交通线路工和城市轨道交通列车检修工。


有趣的是,这15个“官方认证”的新职业具有较强的代表性,以普遍性人机交互为一个典型特征的“同盟时代”已拉开大幕。


1.1 人工智能等新兴战略产业迎来人才需求爆发


数据显示,2019年春招旺季人才需求增幅最高的15个职位中,人工智能类占据六席。


640?wx_fmt=png


进入2019年,企业在高度重视基础研究的同时,侧重人工智能场景的应用和落地。图像识别工程师的人才需求增幅同比高达110.9%,深度学习、机器学习等基础层研究职位人才也呈现出了强劲的增长势头。


近三年,生物制药岗位人才需求年复合增长率达到40%。2019年春招旺季,制药研发岗位均薪同比涨幅为2.2%,较其他热门岗位低3-10个百分点不等。


拥有3年以上经验的运营老手格外受到游戏公司青睐,较无经验要求的游戏运营,均薪高出32%。


1.2 物联网与5G发展进入快车道


随着科技变革和产业结构调整,新兴职业不断涌现。以人社部拟确认的15个新职业为例,部分在2019年招聘旺季已显示出强劲的增长潜力。


总体来看,这些职位要么需要丰富的专业技术和知识作为支撑,要么对求职者有较高的操作技能要求。


  • 物联网工程师


工信部数据显示,2016年,我国物联网市场规模已超过9000亿元,预计到2020年产业规模将会超过1.5万亿元。数据显示,2019年春招旺季,嵌入式工程师人才需求同比增速超过46%,由于人才紧缺程度高于其他技术职位,嵌入式工程师平均招聘薪酬达到18132元。


640?wx_fmt=png


  • 5G网络工程师


随着5G时代大幕的逐步拉开,5G通信类相关人才的需求量出现爆发式增长。


640?wx_fmt=png


数据显示,2019年春招旺季期间,光传输工程师和无线射频工程师的需求同比增幅均超过80%。此外,5G软件工程师、5G系统工程师的需求也较2018年同期增长20-40%不等。


5G工程师平均招聘薪酬达到1.39万元,同比2017年增长12.2%,其中80分位的薪酬较2017年增长近20%。


1.3 人才转行节奏加快,求职态度渐趋谨慎


随着我国经济结构持续调整,行业格局转变加快,人才行业间流动频率进一步上升。2019年春招旺季,求职者转行率为47%,同比2018年增加2个百分点。


尽管求职者跳槽热情高涨,但我们发现,由于经济波动和裁员消息引发的信心不足,更多求职者不再选择裸辞,而更倾向于“骑驴找马”。 



640?wx_fmt=png

上坡时代:行业升级阵痛与人才需求结构转型



进入2019年春招旺季,人才市场依然保持供需两旺的情势,新兴行业对求职者也保持着较高的吸引力。


640?wx_fmt=png


指数显示,互联网和制药医疗业分列一二位;传统行业中,房地产/建筑业排名上升,金融业则从2018年同期的第二位退至11位。


2.1 互联网:人才形势冰火两重天


2019年春招旺季,互联网行业的人才吸引力指数同比下降15%至1.22,这也是近5年来互联网行业的人才吸引力指数首次跌破1.25。


640?wx_fmt=png


从互联网细分领域来看,2019年春招旺季,人才流动率最高的前三位分别为音乐/视频、社交网络及游戏,TOP3领域中,泛娱乐行业占据两席。


人工智能则排在第四位,AI行业虽因为强技术壁垒限制了人才池大小,但也因其顶级薪酬水平及展现出的未来感,使其具有极强的吸引力。


在泛娱乐和人工智能行业高歌猛进的同时,曾经在资本裹挟下风光无限的互联网金融、区块链、共享经济等领域正从神坛逐渐跌落至裁员求生的地步。


640?wx_fmt=png


数据显示,2018年四季度,从共享经济和区块链领域离职的人数比上半年总和还要高出10个百分点。低迷的市场环境削弱了求职者的应聘积极性,导致行业人才从2018年的小幅净流入进入2019年初的大幅净流出阶段。


2.2 制药医疗:呈现整体向好态势


与互联网细分领域冰火两重天的情况相比,制药医疗领域则呈现整体向好态势。


2019年旺季,制药医疗领域人才吸引力指数达到1.17,排名第二。生物制药,医疗器械、健康护理等细分领域的人才吸引力均在上升。


2.3 房地产/建筑:政策调控促使行业分散布局


2019年旺季,房地产/建筑行业的人才吸引力指数排在第三位。2018年政府对房地产行业的调控依旧保持高压态势,令诸多房产企业开始认真寻求转型,向长租公寓、物业服务、旅游地产等业务进行分散式布局,创造了更加多元化的职位结构。


2.4 金融:行业面临重大调整,吸引力指数骤降


随着“防风险去杠杆”政策和资管新规推行,加上量化紧缩和动荡的市场环境,2018年国内金融业出现重大调整,从银行、证券到基金、信托,金融行业各领域业务几乎全线下滑。


640?wx_fmt=png


数据显示,金融行业人才吸引力指数排名从2018年春季的第二位降至2019年的11位,人才吸引力降幅高达43%,创历年之最。



640?wx_fmt=png

流动时代:城市群的“人才资本之战”



3.1 杭州武汉成都稳坐新一线城市人才争夺战三甲,东莞长沙首次冲进前五


春节过后,随着各地新一轮人才引进政策的陆续颁布,“抢人大战”进入白热化阶段,人才的区域间流动更加频繁。数据显示,2019年1-2月,一线城市人才继续流出至新一线城市及省会城市,净流出率为0.61%,较2018年同期增加0.08个百分点。


640?wx_fmt=png


相应地,2019年1-2月,杭州、武汉、成都成为求职者离开一线城市后首选的前三个城市,稳坐新一线城市人才争夺战三甲。


一个有趣的发现是,2019年1-2月,在离开一线城市求职者群体的目标城市中,东莞和长沙首次冲进前五。


3.2 人才流动的城市集聚效应显著


2019年春招旺季,从一线城市离开的求职者倾向于将其他一线城市作为下一阶段的首选目标。


640?wx_fmt=png


其中,从北京离开的求职者下一目标城市较为分散,9.2%首选上海,37.5%主要选择新一线城市或东部地区省会城市发展。


而离开上海、广州和深圳的求职者,下一个意向城市较为集中,57.1%仍然选择在长三角、珠三角地区内部迁移。


3.3 2019旺季新一线城市人才需求提升


2019年1-2月,一线城市的人才需求占总体比例较2018年同期有小幅下降。杭州、成都、武汉、西安四个具有代表性的新一线城市人才需求同比均大幅上升,与一线城市的差距也正在缩小。


640?wx_fmt=png


3.4 西安、武汉人才补给稳定,深圳受抢人大战影响最小


20个月以来,新一线城市中,西安和武汉的人才补给最为稳定,除了极大降低落户门槛之外,两座城市的区位优势和硬科技投入也成为加分项,自2017年以来,始终维持人才净流入。


640?wx_fmt=png


值得注意的是,相比其他三个一线城市,深圳并未受到“抢人大战”的太大影响,是自2017年以来,唯一保持了人才小幅净流入的一线城市。


3.5 新一线城市人才期望收入普遍上涨


薪资福利也是求职者选择目标城市的重要考量因素。数据显示,2019年1-2月,一线城市求职者平均期望月薪为9794元。以杭州、成都、武汉、西安为代表的新一线城市,平均期望月薪达到7799元,较2018年上涨5个百分点。


640?wx_fmt=png


3.6 新一线城市加速发展战略新兴产业,5G和人工智能人才需求急剧提升


数据显示,2019年初,北京新一代信息技术和人工智能人才需求占城市人才需求的比例高达20%,位居全国首位,上海紧随其后。


640?wx_fmt=png


杭州、成都、西安、武汉的新一代信息技术和人工智能人才需求比例均较2018年有所上升,战略新兴产业发展氛围浓厚。


640?wx_fmt=jpeg

 热 文 推 荐 

☞ 华为 5G 硬实力

☞ Java 开发者希望未来使用 Python 和 Go

☞“边缘计算将吞掉云计算!”

☞ 18 岁少年盗取价值 90 万元的萌乃币, 交易所被迫关停!

李笑来登顶 GitHub TOP 榜!币圈大佬要教程序员如何自学编程

☞ 马云:蚂蚁金服这样做区块链!

女生适合做程序员吗?

Google首页玩起小游戏,AI作曲让你变身巴赫

曝光!月薪 5 万的程序员面试题:73% 人都做错,你敢试吗?

 
 

System.out.println("点个在看吧!");
console.log("点个在看吧!");
print("点个在看吧!");
printf("点个在看吧!\n");
cout << "点个在看吧!" << endl;
Console.WriteLine("点个在看吧!");
Response.Write("点个在看吧!");
alert("点个在看吧!")
echo "点个在看吧!"

640?wx_fmt=png 喜欢就点击“在看”吧!
CSDN
微信公众号
成就一亿技术人

1. 什么时候需要停止线程?

通常情况下,线程在创建并启动后,会自然运行到结束。但在某些情况下,我们可能需要在运行过程中停止线程,比如:

  • 用户主动取消执行;

  • 线程在运行时发生错误或超时,需要停止;

  • 服务需要立即关闭。

这些情况都需要我们主动停止线程。然而,安全且可靠地停止线程并不容易。Java 语言并没有提供一种机制来确保线程能够立即且正确地停止,但它提供了interrupt方法,这是一种协作机制。

2. 如何正确停止线程?

你可以使用interrupt方法来通知线程应该中断执行,而被中断的线程拥有决定权,即它不仅可以决定何时响应中断并停止,还可以选择忽略中断。

换句话说,如果被停止的线程不想被中断,那么我们除了让它继续运行或强制关闭进程外,别无他法。

3. 为什么不强制停止?而是通知、协作

事实上,大多数时候我们想要停止线程时,至少会让它运行到结束。比如,即使我们在关闭电脑时,也会进行很多收尾工作,结束一些进程并保存一些状态。

线程也是如此。我们想要中断的线程可能并不是由我们启动的,我们对其执行的业务逻辑并不熟悉。如果我们希望它停止,实际上是希望它在停止前完成一系列的保存和交接工作,而不是立即停止。

举个生活中的例子:

某天下午你得知公司要裁员,觉得自己很可能在名单内,便开始找新工作。几周后,成功拿到另一家公司 offer。你准备搬到新公司附近,可家里东西多,只能分批处理。搬到一半时,发现公司裁员结束,自己不在名单中。

你十分高兴,因为喜欢这家公司,决定留下。但一半物品已搬到新家,还得搬回来。

试想,若此时你决定立刻停止搬家、什么都不做,已搬走的物品就会丢失,这无疑是场灾难!

生活中还有很多类似的例子,比如从电脑剪切文件到 U 盘。如果剪切到一半时停止,需要恢复到原来的状态,不能一半文件在 U 盘,一半在电脑上。

4. 代码实践

4.1. 错误的线程停止方式

使用stop()方法终止线程执行会导致线程立即停止,这可能会引发意外问题。

java
代码解读
复制代码
public class StopThread implements Runnable {     @Override     public void run() {         System.out.println("Start moving...");         for (int i = 1; i <= 5; i++) {             // 模拟搬家所需时间             int j = 50000;             while (j > 0) {                 j--;             }             System.out.println(i + " batches have been moved");         }         System.out.println("End of moving");     }     public static void main(String[] args) throws InterruptedException {         Thread thread = new Thread(new StopThread());         thread.start();         // 稍后尝试停止         Thread.sleep(2);         thread.stop();     } }

输出结果(结果可能因计算机性能不同而有所差异,你可以调整时间以获得相同的输出):

sql
代码解读
复制代码
Start moving... 1 batches have been moved 2 batches have been moved 3 batches have been moved

可以看到,stop强制线程结束,导致只搬了三批物品,结束后也没有搬回来!

出于安全考虑,stop方法已被官方弃用。你可以在源码中看到它被标记为过时。

java
代码解读
复制代码
@Deprecated public final void stop() {     SecurityManager security = System.getSecurityManager();     if (security != null) {         checkAccess();         if (this != Thread.currentThread()) {             security.checkPermission(SecurityConstants.STOP_THREAD_PERMISSION);         }     } }

4.2. 直接使用interrupt方法,线程并未停止

在主线程中使用interrupt方法中断目标线程,但目标线程并未感知到中断标志,即它不打算处理中断信号。

java
代码解读
复制代码
public class InterruptThreadWithoutFlag implements Runnable {     @Override     public void run() {         System.out.println("Start moving...");         for (int i = 1; i <= 5; i++) {             // 模拟搬家所需时间             int j = 50000;             while (j > 0) {                 j--;             }             System.out.println(i + " batches have been moved");         }         System.out.println("End of moving");     }     public static void main(String[] args) throws InterruptedException {         Thread thread = new Thread(new StopThread());         thread.start();         // 稍后         Thread.sleep(2);         thread.interrupt();     } }

输出:

sql
代码解读
复制代码
Start moving... 1 batches have been moved 2 batches have been moved 3 batches have been moved 4 batches have been moved 5 batches have been moved End of moving

你会发现没有任何效果。我们使用interrupt中断了这个线程,但它似乎完全忽略了我们的中断信号。就像前面提到的,线程是否停止取决于它自己,因此我们需要修改线程的逻辑,使其能够响应中断,从而停止线程。

4.3. 使用interrupt时,线程识别中断标志

当指定线程被中断时,在线程内部调用Thread.currentThread().isInterrupted()会返回true,可以根据此进行中断后的处理逻辑。

java
代码解读
复制代码
public class InterruptThread implements Runnable {     @Override     public void run() {         System.out.println("Start moving...");         for (int i = 1; i <= 5; i++) {             if (Thread.currentThread().isInterrupted()) {                 // 做一些收尾工作                 break;             }             // 模拟搬家所需时间             int j = 50000;             while (j > 0) {                 j--;             }             System.out.println(i + " batches have been moved");         }         System.out.println("End of moving");     }     public static void main(String[] args) throws InterruptedException {         Thread thread = new Thread(new InterruptThread());         thread.start();         Thread.sleep(2);         thread.interrupt();     } }

输出(结果可能不一致):

sql
代码解读
复制代码
Start moving... 1 batches have been moved End of moving

从输出结果来看,它与使用stop方法的结果类似,显然线程在执行完之前被停止了,interrupt()方法的中断是有效的,这是一种标准的处理方式。

4.4. 中断某个线程时,线程正在睡眠

如果线程处理中使用了sleep方法,在sleep期间的中断也可以响应,而无需检查中断标志。

例如,使用Thread.sleep(1)模拟每次搬家所需的时间。在主线程中,等待 3ms 后中断,因此预计在搬完 2 到 3 批物品后会被中断。代码如下:

java
代码解读
复制代码
public class InterruptWithSleep implements Runnable {     @Override     public void run() {         System.out.println("Start moving...");         for (int i = 1; i <= 5; i++) {             // 模拟搬家所需时间             try {                 Thread.sleep(1);                 System.out.println(i + " batches have been moved");             } catch (InterruptedException e) {                 System.out.println(e.getMessage());                 break;             }         }         System.out.println("End of moving");     }     public static void main(String[] args) throws InterruptedException {         Thread thread = new Thread(new InterruptWithSleep());         thread.start();         // 稍后         Thread.sleep(3);         thread.interrupt();     } }

输出:

sql
代码解读
复制代码
Start moving... 1 batches have been moved 2 batches have been moved sleep interrupted End of moving

发现了吗?额外输出了sleep interrupted。这是因为发生了中断异常,我们在catch到InterruptedException后输出了e.getMessage()。

为什么会抛出异常?

这是因为当线程处于sleep状态时,如果接收到中断信号,线程会响应这个中断,而响应中断的方式非常特殊,就是抛出java.lang.InterruptedException: sleep interrupted异常。

因此,当我们的程序中有sleep方法的逻辑,或者可以阻塞线程的方法(如wait、join等),并且可能会被中断时,我们需要注意处理InterruptedException异常。我们可以将其放在catch中,这样当线程进入阻塞过程时,仍然可以响应中断并进行处理。

4.5. 当sleep方法与isInterrupted结合使用时会发生什么?

你注意到在示例 3 的代码中,我们在捕获异常后使用了break来主动结束循环吗?那么,我们是否可以在catch中不使用break,而是在循环入口处判断isInterrupted是否为true呢?

让我们试试:

java
代码解读
复制代码
public class SleepWithIsInterrupted implements Runnable {     @Override     public void run() {         System.out.println("Start moving...");         for (int i = 1; i <= 5; i++) {             if (Thread.currentThread().isInterrupted()) {                 // 做一些收尾工作                 break;             }             // 模拟搬家所需时间             try {                 Thread.sleep(1);                 System.out.println(i + " batches have been moved");             } catch (InterruptedException e) {                 System.out.println(e.getMessage());             }         }         System.out.println("End of moving");     }     public static void main(String[] args) throws InterruptedException {         Thread thread = new Thread(new SleepWithIsInterrupted());         thread.start();         // 稍后         Thread.sleep(3);         thread.interrupt();     } }

输出(你可能需要调整主线程执行Thread.sleep的时间以获得相同的输出):

sql
代码解读
复制代码
Start moving... 1 batches have been moved 2 batches have been moved sleep interrupted 4 batches have been moved 5 batches have been moved End of moving

为什么在输出sleep interrupted后,它继续搬了第四和第五批物品?

原因是,一旦sleep()响应了中断,它会重置isInterrupted()方法中的标志,因此在上面的代码中,循环条件检查时,Thread.currentThread().isInterrupted()的结果始终为false,导致程序无法退出。

一般来说,在实际的业务代码中,主逻辑更为复杂,因此不建议在这里直接使用try-catch处理中断异常,而是直接将异常向上抛出,由调用方处理。

可以将当前逻辑封装到一个单独的方法中,并将中断后的收尾处理也封装到另一个方法中,如下所示:

java
代码解读
复制代码
public class SleepSplitCase implements Runnable {     @Override     public void run() {         try {             move();         } catch (InterruptedException e) {             System.out.println(e.getMessage());             goBack();         }     }     private void move() throws InterruptedException {         System.out.println("Start moving...");         for (int i = 1; i <= 5; i++) {             // 模拟搬家所需时间             Thread.sleep(1);             System.out.println(i + " batches have been moved");         }         System.out.println("End of moving");     }     private void goBack() {         // 做一些收尾工作     }     public static void main(String[] args) throws InterruptedException {         Thread thread = new Thread(new SleepSplitCase());         thread.start();         // 稍后         Thread.sleep(3);         thread.interrupt();     } }

4.6. 重新中断

有没有办法在catch之外处理goBack方法?

如前所述,当中断发生并抛出InterruptedException时,isInterrupted的结果会被重置为false。但是,支持再次调用interrupt,这会使isInterrupted的结果变为true。

基于这个前提,我们可以在示例 5 的实现中将run方法改为以下形式:

java
代码解读
复制代码
@Override public void run() {     try {         move();     } catch (InterruptedException e) {         System.out.println(e.getMessage());         Thread.currentThread().interrupt();     }     if (Thread.currentThread().isInterrupted()) {         goBack();     } }

这样可以避免在catch代码块中处理业务逻辑!

4.7 判断中断是否发生的方法

  • boolean isInterrupted(): 判断当前线程是否被中断;

  • static boolean interrupted(): 判断当前线程是否被中断,但在调用后会将中断标志直接设置为false,即清除中断标志。

注意,interrupted()方法的目标是当前线程,无论该方法是从哪个实例对象调用的,从源码中可以很容易看出:

java
代码解读
复制代码
public class CheckInterrupt {     public static void main(String[] args) throws InterruptedException {         Thread subThread = new Thread(() -> {             // 无限循环             for (; ; ) {             }         });         subThread.start();         subThread.interrupt();         // 获取中断标志         System.out.println("isInterrupted: " + subThread.isInterrupted());         // 获取中断标志并重置         // (尽管 interrupted() 是由 subThread 线程调用的,但实际执行的是当前线程。)         System.out.println("isInterrupted: " + subThread.interrupted());         // 中断当前线程         Thread.currentThread().interrupt();         System.out.println("isInterrupted: " + subThread.interrupted());         // Thread.interrupted() 与 subThread.interrupted() 效果相同         System.out.println("isInterrupted: " + Thread.interrupted());     } }

输出:

vbnet
代码解读
复制代码
isInterrupted: true isInterrupted: false isInterrupted: true isInterrupted: false

interrupted()会重置中断标志,因此最后的输出结果变为false。

5. JDK 内置的可以响应中断的方法

主要有以下方法可以响应中断并抛出InterruptedException:

  1. Object.wait()/wait(long)/wait(long, int)

  2. Thread.sleep(long)/sleep(long, int)

  3. Thread.join()/join(long)/join(long, int)

  4. java.util.concurrent.BlockingQueue.take()/put(E)

  5. java.util.concurrent.locks.Lock.lockInterruptibly()

  6. java.util.concurrent.CountDownLatch.await

  7. java.util.concurrent.CyclicBarrier.await

  8. java.util.concurrent.Exchanger.exchange(V)

  9. java.nio.channels.InterruptibleChannel的相关方法

  10. java.nio.channels.Selector的相关方法

好了,这次的内容就到这里,下次再见!

注:本文转载自blog.csdn.net的CSDN资讯的文章"https://blog.csdn.net/csdnnews/article/details/88801205"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top