java并行流 阻塞主线程_多线程入门案例与java8的并行流

java8 实例请移步https://www.cnblogs.com/ngLee/p/14021859.html

进程与线程

进程是所有线程的集合,每一个线程是进程中的一条执行路径。

多线程的创建方式,继承Thread\实现Runable

/**

* 第一种创建线程的方式,继承Thread

*/

public class MultiThread extends Thread{

@Override

public void run() {

for (int i = 0; i < 10; i++) {

System.out.println(Thread.currentThread().getName()+"....."+i);

}

}

}

/**

* 第二种,实现Runnable接口,更易于扩展。(多实现,单继承)

*/

public class MultiThread2 implements Runnable {

@Override

public void run() {

for (int i = 0; i < 10; i++) {

System.out.println(Thread.currentThread().getName()+"---"+i);

}

}

}

/**

* 测试类

*/

public class TestThread {

public static void main(String[] args) {

System.out.println(Thread.currentThread().getName()+"---开始");

//1.多线程创建 继承Thread

MultiThread multiThread = new MultiThread();

Thread thread = new Thread(multiThread,"线程继承Thread-1");

Thread thread2 = new Thread(multiThread,"线程继承Thread-2");

//2.启动多线程调用的是start(),而不是run()

thread.start();

thread2.start();

//3.打印效果 当前线程:线程1

/**********************************/

//2 实现Runnable

Runnable runnable = new MultiThread2();

Thread thread3 = new Thread(runnable,"线程实现Runnable-1");

Thread thread4 = new Thread(runnable,"线程实现Runnable-2");

thread3.start();

thread4.start();

//3 匿名内部类的方式

Thread thread5 = new Thread(new Runnable() {

@Override

public void run() {

for (int i = 0; i < 3; i++) {

System.out.println(Thread.currentThread().getName()+"匿名内部类----"+i);

}

}

});

thread5.start();

System.out.println(Thread.currentThread().getName()+"---结束");

}

}

效果展示:并不是按照自上而下的执行

537181f4e394496bf9296fac49391a69.png

线程的几个状态

4d95e2c6612ef288fc3024f6831af51c.png

新建状态:当用new操作符创建一个线程时, 例如new Thread(r),线程还没有开始运行,此时线程处在新建状态。 当一个线程处于新生状态时,程序还没有开始运行线程中的代码。

就绪状态:一个新创建的线程并不自动开始运行,要执行线程,必须调用线程的start()方法。当线程对象调用start()方法即启动了线程,start()方法创建线程运行的系统资源,并调度线程运行run()方法。当start()方法返回后,线程就处于就绪状态。处于就绪状态的线程并不一定立即运行run()方法,线程还必须同其他线程竞争CPU时间,只有获得CPU时间才可以运行线程。因为在单CPU的计算机系统中,不可能同时运行多个线程,一个时刻仅有一个线程处于运行状态。因此此时可能有多个线程处于就绪状态。对多个处于就绪状态的线程是由Java运行时系统的线程调度程序(thread scheduler)来调度的。

运行状态:当线程获得CPU时间后,它才进入运行状态,真正开始执行run()方法。

阻塞状态: 线程运行过程中,可能由于各种原因进入阻塞状态:

1>线程通过调用sleep方法进入睡眠状态;

2>线程调用一个在I/O上被阻塞的操作,即该操作在输入输出操作完成之前不会返回到它的调用者;

3>线程试图得到一个锁,而该锁正被其他线程持有;

4>线程在等待某个触发条件;

死亡状态:有两个原因会导致线程死亡:1)run方法正常退出而自然死亡,2)一个未捕获的异常终止了run方法而使线程猝死。为了确定线程在当前是否存活着(就是要么是可运行的,要么是被阻塞了),需要使用isAlive方法。如果是可运行或被阻塞,这个方法返回true; 如果线程仍旧是new状态且不是可运行的, 或者线程死亡了,则返回false.

简单需求:目前蚂蚁课堂有10万个用户,现在蚂蚁课堂需要做活动,给每一个用户发送一条祝福短信

/**

* 提交实体

*/

public class UserThread extends Thread {

private List uList;

public UserThread(List uList){

this.uList = uList;

}

public List getuList() {

return uList;

}

public void setuList(List uList) {

this.uList = uList;

}

@Override

public void run() {

uList.stream().forEach(userEntity -> {

System.out.println("threadName:" + Thread.currentThread().getName() + "-用户记录序号:" + userEntity.getUno()

+ "---用户名称:" + userEntity.getUname());

//短信发送接口

});

}

}

/**

* 测试类

*/

public class TestThread {

public static void main(String[] args) {

//所有记录

List list = new ArrayList<>();

for (int i = 0; i < 100; i++) {

UserEntity userEntity = new UserEntity();

userEntity.setUno("用户id"+i);

userEntity.setUname("用户名字"+i);

list.add(userEntity);

}

//将数据进行分割,每组四千,这个每组数据量最好取配置,使用高峰期调低,保证不会超时

int everyNum = 20;

List> lists= spiltList(list,everyNum);

for (int i = 0; i < lists.size(); i++) {

Thread th = new UserThread(lists.get(i));

th.start();

}

//第二种java8 并行流,底层:ForkJoin --todo

//使用并行流的时候,最好不要修改数据,如果需要map里的返回值,则用Collectors进行收集,不要foreach里用list.add()

lists.parallelStream().forEach( lst -> {

lst.parallelStream().forEach( userEntity -> {

System.out.println("threadName:" + Thread.currentThread().getName() + "-用户记录序号:" + userEntity.getUno()

+ "---用户名称:" + userEntity.getUname());

});

});

}

private static List> spiltList(List list, int everyNum) {

//总数据量

int total = list.size();

//分组数量

int group = total%everyNum == 0 ? total/everyNum : total/everyNum +1 ;

//java8 stream

List userList = Stream.iterate(0, n->n+1).

limit(group).parallel().

map(seed -> {

List list1 = list.stream().skip(seed * everyNum).limit(everyNum).

collect(Collectors.toList());

return list1;

}

).collect(ArrayList::new,ArrayList::add,List::addAll);

return userList;

}

}

打印效果如图,不是按顺序打印,但这不正好就是多线程需要的效果的了吗?

15fcb15b1cccbb42780b5e11c4942043.png

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

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

相关文章

BlazorCharts 原生图表库的建设历程

点击蓝字关注我们背景目前 Blazor 中可用的图表组件库主要有以下几个&#xff1a;ant-design-blazor/ant-design-charts-blazor-基于G2Plot mariusmuntean/ChartJs.Blazor- 基于ChartJs blazor-cn/Blazor.ECharts- 基于EChartsant-design-charts-blazor是我主导完成的&#xff…

别光顾着背单词了,每天花18分钟做这件事,英语水平暴增!

全世界只有3.14 % 的人关注了数据与算法之美在知乎上看过一个问题&#xff1a;在当今社会&#xff0c;英语还重要吗&#xff1f;点赞第一的回答是——英语可以差&#xff0c;但你的口语一定要好&#xff01;你记住了1万个单词、将语法书倒背如流、英语成绩名列前茅、英语证书一…

WPF 路径动画PathAnimations的使用

在wpf中让一个控件按照一定的路径运行的动画。。叫做路径动画&#xff0c;这个示例演示了让一个rectangle按照一个s形曲线反复运行的动画。效果&#xff1a;只有一个文件&#xff1a;全部代码如下 &#xff1a;<Window x:Class"wpfcore.MainWindow"xmlns"htt…

STEM科学实验:测试了2000+儿童后证明它秒杀了90%的玩具!

▲数据汪特别推荐点击上图进入玩酷屋除了ipad和那些普通的玩具&#xff0c;我们还能给孩子玩儿些什么&#xff1f;当然是“玩”科学。因为创造力是他们这个年纪&#xff0c;最需要培养的东西。真正的科学启蒙不是将科学知识生硬的灌输给孩子&#xff0c;而是要让孩子在探索中能…

人工智能时代,学好数学有什么用?

随着科技的快速发展&#xff0c;人工智能的热度越来越高。而数学知识蕴含着处理智能问题的基本思想与方法&#xff0c;是理解复杂算法的必备要素。在机器学习工作流程中&#xff0c;数学与代码高度交织在一起&#xff0c;代码通常可以根据数学直观地构建&#xff0c;甚至会共享…

使用CLI模板 | Visual Studio 2019(16.10)新功能试用

Visual Studio很早以前就有模板了&#xff0c;.NET Core命令行界面&#xff08;CLI&#xff09;也能够安装模板并通过dotnet new命令使用它们。然而&#xff0c;但是并没有什么简单的方法可以在Visual Studio中直接使用这些模板。在Visual Studio 2019(16.10)中&#xff0c;启用…

jmeter测试java服务_Jmeter 测试 JMS (Java Message Service)/ActiveMQ 性能

前言JMS 介绍:JMS 即 Java 消息服务(Java Message Service)应用程序接口&#xff0c;是一个 Java 平台中关于面向消息中间件(MOM)的 API&#xff0c;用于在两个应用程序之间&#xff0c;或分布式系统中发送消息&#xff0c;进行异步通信。(百度)本文只测试 ActiveMQ,其他消息中…

MetroGridHelper: A helpful debugging assistant for designers and developers alike

You’ve heard me preach it before: fix those margins, align, and try and make your apps as beautiful and inspiring as you can (see also: my designer tips for developers). On Thursday, I stopped by the Windows Phone Design Team’s beautiful studio space her…

马斯克和贝索斯的“星球大战”

全世界只有3.14 % 的人关注了数据与算法之美商业太空计划已经蓬勃发展了十年。在这个领域中&#xff0c;最雄心勃勃的两家公司当属Blue Origin&#xff08;蓝色起源&#xff09;和SpaceX&#xff08;太空探索技术公司&#xff09;&#xff0c;而它们之间的竞争一直是众人的焦点…

java pojo 是什么_什么是POJO

POJO(Plain Old Java Objects)简单的Java对象&#xff0c;实际就是普通JavaBeans&#xff0c;是为了避免和EJB混淆所创造的简称。在Java应用程序中的角色使用POJO名称是为了避免和EJB混淆起来, 而且简称比较直接. 其中有一些属性及其gettersetter方法的类,没有业务逻辑&#xf…

JMeter基础知识

2019独角兽企业重金招聘Python工程师标准>>> 1.JMeter常用术语 1&#xff09;采样器&#xff08;Samplers&#xff09; 采样器是JMeter测试脚本的基础单元&#xff0c;用户可以用他来向服务器发出一个特定的请求&#xff0c;比如HTTP请求、JAVA请求。 2&#xff…

开年趣图汇总:对不起,让你笑了这么久

全世界只有3.14 % 的人关注了数据与算法之美房东家小孩抓周&#xff0c;感觉不管抓什么都很有未来....计算机语言成就一段恋情程序员&#xff0c;千万别像他学习如果编程语言是工具你这工作怎么越做越晚呢&#xff1f;那一刻&#xff0c;程序员露出了尴尬又不失礼貌的微笑这个名…

【视频回放】Best of Build Tour in China 暨 Watching Party - 大湾区专场

活动介绍微软一年一度的Build大会已经在5月25-27日盛大召开&#xff0c;今年的主题演讲&#xff0c;全球CEO Satya Nadella从开发者速度&#xff0c;智能云原生应用&#xff0c;以及在混合工作场景下提高生产力等诸多话题进行探讨。为了让技术社区和开发者更好地了解微软Build大…

Entity Framework Core 6.0 预览4 性能改进

起因微软在Build2021开发者大会上,发布Entity Framework Core 6.0(简称EFCore 6)预览第四版,号称是性能版本,性能提升主要对于Entity Framework Core 5.性能改进:EFCore 5.0和EFCore 6.0基准测试,提升了70%.在查询时,比EFCore5.0提升了31%.内存改进了不少,减少43%.减少内存分配…

这个地球仪太惊艳了,陪孩子畅聊天文地理。

▲数据汪特别推荐点击上图进入玩酷屋一个人一旦对某事物有了浓厚的兴趣&#xff0c;就会主动去求知、去探索、去实践&#xff0c;并在求知、探索、实践中产生愉快的情绪和体验。所以&#xff0c;古今中外的教育家无不重视兴趣在智力开发中的作用。小木之前推荐过一款AR地球仪&a…

两篇很牛的vim使用技巧

2019独角兽企业重金招聘Python工程师标准>>> 读本文之前请注意&#xff1a; 1. 本文的目标是提供一些vim的使用技巧&#xff0c;利用这些技巧可以提高vim的操作效率。部分技巧在vi上也可以使用&#xff0c;但是现在基本上都是用vim了。 2. 本文是整理和总结使用技巧…

辍学程序员改变世界,这位长得像马云的90后要击败Facebook的扎克伯格了…

全世界只有3.14 % 的人关注了数据与算法之美众所周知&#xff0c;Facebook的创始人扎克伯格&#xff08;Mark Zuckerberg&#xff09;&#xff0c;是史上最年轻的世界亿万富豪。小扎作为社交网络时代的的缔造者&#xff0c;成为了当之无愧的程序员界80后杰出代表。但数据汪今天…

java十六进制大小端转换_字节顺序

1、定义 字节顺序,又称端序或尾序(英语:Endianness),在计算机科学领域中,指电脑内存中或在数字通信链路中,组成多字节的字的字节的排列顺序。 在几乎所有的机器上,多字节对象都被存储为连续的字节序列。 2、表现形式 字节的排列方式有两个通用规则。例如,将一个多位数的…

Android开发入门之学习笔记(三):程序窗口的布局

2019独角兽企业重金招聘Python工程师标准>>> Android应用程序的用户界面可以看作是由View和View Group组成的&#xff0c;从字面意思上就可以看出&#xff0c;View Group是可以包含多个View的。借用官方教程的图可以更容易理解&#xff1a; 说到这里&#xff0c;我…

c#爬虫-解决ChromeDriver 版本问题

问题Selenium c# 进行爬虫时报错 selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 84产生问题的原因因为下载的ChromeDriver版本与本地chrome浏览器的版本不一致导致的。因…