简单网上书店网站建设php,博客为什么用wordpress,网站开发公司 广告词,网站功能优化的方法java8 实例请移步https://www.cnblogs.com/ngLee/p/14021859.html进程与线程进程是所有线程的集合#xff0c;每一个线程是进程中的一条执行路径。多线程的创建方式#xff0c;继承Thread\实现Runable/*** 第一种创建线程的方式#xff0c;继承Thread*/public class MultiTh…java8 实例请移步https://www.cnblogs.com/ngLee/p/14021859.html进程与线程进程是所有线程的集合每一个线程是进程中的一条执行路径。多线程的创建方式继承Thread\实现Runable/*** 第一种创建线程的方式继承Thread*/public class MultiThread extends Thread{Overridepublic void run() {for (int i 0; i 10; i) {System.out.println(Thread.currentThread().getName().....i);}}}/*** 第二种实现Runnable接口更易于扩展。(多实现单继承)*/public class MultiThread2 implements Runnable {Overridepublic 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.多线程创建 继承ThreadMultiThread 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 实现RunnableRunnable 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() {Overridepublic void run() {for (int i 0; i 3; i) {System.out.println(Thread.currentThread().getName()匿名内部类----i);}}});thread5.start();System.out.println(Thread.currentThread().getName()---结束);}}效果展示并不是按照自上而下的执行线程的几个状态新建状态当用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;}Overridepublic 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(用户idi);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 streamList userList Stream.iterate(0, n-n1).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;}}打印效果如图不是按顺序打印但这不正好就是多线程需要的效果的了吗