欧昊

欧昊 查看完整档案

广州编辑广州大学  |  金融管理 编辑  |  填写所在公司/组织填写个人主网站
编辑

新手后端工程师,求各位大佬指导~~

个人动态

欧昊 发布了文章 · 9月19日

码舅舅 - 完美解决微信被动加好友显示过于频繁的方法

工具/物料

码舅舅: http://www.mjvf.cn

功能/描述

码舅舅是一款好用的二维码制作工具。支持生成各种类型的二维码,如永久有效的客服码、个人号引流防封码、个性二维码等等,核心技术是帮微商解决个人号每日被动添加好友过于频繁导致被限流、被封号的问题。

操作/步骤

1、首先要准备多个微信号,用于分流装人。由于每个微信号只能装5000人,而且每日装人的数量也有限,故需要准备多个个人号。
2、然后使用工具新建一张专属二维码(二维码可以自行选择样式,比如换颜色,加logo,加导流语等等)
3、接着将准备好的微信号二维码保存到手机,打开工具,选择上传至二维码管理栏然后保存
4、最后在控制面板里获取你的个人专属二维码即可

需求/场景

目前,微信限制加好友已然成为常态,不管是主动加人还是被动。
故很多微商都会采用多个微信号轮流加人的方案,那么光准备很多微信号是没用的,因为对外宣传只需要一张二维码,多张二维码一起宣传有点不切实际,故需要一个像码舅舅一样能把多个微信号合并为一张二维码的工具。

拓展/养号

上文所说的是主要解决方案,那么大家平时怎么自我避免呢?比如养号,养号只需注意5个重要参数,每天去完成相关的行为就可以了。

1、打开率:每天打开微信的次数。

2、使用时长:每天使用微信的时长。

3、好友率:互通率是指通讯录和微信好友的比率,假如通讯录里有500人,一个好友都没有,直接列入异常。

4、互动率:单向、双向、新加好友与回应度、回应内容等。

5、朋友圈使用规范:合法、拒绝骚扰、内容、形式、频率、行为等。
指数是微信审核里的硬指标,只有把四个指数和以下五个数值组合在一起,才能做到模拟真正的用户行为。

查看原文

赞 0 收藏 0 评论 0

欧昊 发布了文章 · 2019-12-07

LogBack

首先谈到日志,我们可能听过log4j logback slf4j这三个名词,那么它们之间的关系是怎么样的呢?SLF4J,即简单日志门面(Simple Logging Facade for JAVA),不是具体的日志解决方案,它只服务于各种各样的日志系统。一般来说,slf4j配合log4j、logback进行使用,可以理解为slf4j是标准,log4j和logback是实现.

这次讲下logback-spring.xml的配置

Appender

Logback将执行日志事件输出的组件称为Appender
实现的Appender必须继承 ch.qos.logback.core.Appender接口,这个接口有一个doAppender方法
Appender最终都会负责输出日志,但是他们也可能将日志格式化的工作交给Layout,或者Encoder对象。
logback-spring.xml中有许多的appender,这里我们挑几个项目中用的讲下
ConsoleAppender

顾名思义这个是打印到控制台的appender
AsyncAppender

AsyncAppender记录ILoggingEvents的方式是异步的。它仅仅相当于一个event分配器,因此需要配合其他appender才能有所作为。

RollingFileAppender

RollingFileAppender继承自FileAppender,提供日志目标文件自动切换的功能。例如可以用日期作为日志分割的条件。
RollingFileAppender有两个重要属性,RollingPolicy负责怎么切换日志,TriggeringPolicy负责何时切换.
为了使RollingFileAppender起作用,这两个属性必须设置,但是如果RollingPolicy的实现类同样实现了TriggeringPolicy接口,则也可以只设置RollingPolicy这个属性。

RollingPolicy

负责日志文件的切换以及重命名
TimeBasedRollingPolicy:日志滚动策略基于时间的,例如根据天数,月份

SentryAppender

通过Raven上报的sentry

@Override
    protected void append(ILoggingEvent iLoggingEvent) {
        // Do not log the event if the current thread is managed by raven
        if (RavenEnvironment.isManagingThread())
            return;

        RavenEnvironment.startManagingThread();
        try {
            if (raven == null)
                initRaven();

            if (minLevel != null && !iLoggingEvent.getLevel().isGreaterOrEqual(minLevel))
                return;

            Event event = buildEvent(iLoggingEvent);
            raven.sendEvent(event);
        } catch (Exception e) {
            addError("An exception occurred while creating a new event in Raven", e);
        } finally {
            RavenEnvironment.stopManagingThread();
        }
    }

AmqpAppender

将日志发送到mq中,再由消费者推送到Logstash
启用Appender
appender-ref 表示启用哪些appender

<!-- root级别 DEBUG -->
    <root level="DEBUG">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="ASYNC_DEFAULT" />
        <if condition='property("sentryEnable").contains("true")'>
            <then>
                <appender-ref ref="Sentry" />
            </then>
        </if>
        <if condition='property("elkEnable").contains("true")'>
            <then>
                <appender-ref ref="ELK" />
            </then>
        </if>
    </root>

LayoutBase
Layout是logback中负责把日志事件转换成成字符串的组件,可以理解为日志中需要哪些字段,可以通过layout来做.
可以自定义自己的layout

​​
doLayout
主要负责组装需要上报的信息,比如一些自定义的requestId,reqKey 等

继承LayoutBase<ILoggingEvent>
重写doLayout方法

查看原文

赞 0 收藏 0 评论 0

欧昊 发布了文章 · 2019-10-28

15款最好用的腾讯短链接(url.cn)批量生成工具

整理了15款目前国内最好用的腾讯短链接(url.cn)批量生成工具,拿走不谢!

1、青桃短链接

平台官网:http://qturl.cn

青桃短链接是一个老牌的第三方短链接服务平台了。对于其技术支持和服务质量来说,可以说是国内最好的短链接服务商之一。

该平台可让您通过简单地复制粘贴链接就能缩短你的长链接,您在几秒钟内就可以设置一个新的短链接域名,用于包装你的长链接,且无需验证码或额外的验证。

注册成为会员后,您还能获得更多的功能选择,例如可以批量生成短链接,再例如可以创建防墙短链接等。长期以来,青桃短链接一直是最好的短链接生成工具之一,这来源于其产品高质量和技术的可靠性。

2、快鸟短网址

平台官网:http://kndwz.com

随着移动SEO的重要性越来越重要,在推广的时候如果优化和缩短网页链接可以获得更好的访问。快鸟短网址是一个便捷的长链接缩短工具,用户可以免费使用该平台的接口生成新浪短链接,快鸟短网址不仅可以生成短链接,还支持批量缩短链接,与其他应用程序集成以及短链接跟踪,这对于企业级用户来说,使用起来不仅高效也很便捷。这些特性使它成为一个高质量的软件工具,可更好的帮助你提升推广的效率。

3、蓝鸟短链接

平台官网:http://lnurl.cn

蓝鸟短链接是目前国内最好的第三方短链接生成服务商之一。任何用户都可以匿名使用该平台的短链接接口缩短自己的网址,你也可以跟踪生成短连接的访问量。

但平台的免费接口生成次数是有限的,如果您要订阅无限次数或更多次数,可以开通高级账户,开通后则可以根据自己的需求批量生成更多的短链接了,以及能追踪链接的点击次数和基本数据报告。由于它稳定的技术和便利的链接跟踪,蓝鸟短链接可能是目前排名前三的短链接生成器。

4、冷狗短链接

平台官网:http://dogdwz.cn/

冷狗短链接那边提供最新的新浪T.CN短链接在线生成服务,每天都可以去免费生成新的微博T.CN短网址,他们采用的是新浪微博的官方的原生态生成接口,安全、稳定、一次生成永久使用。。

5、麦云短链接

平台官网:http://maiyurl.cn/

麦云短链接的官网也是可以免费生成短链接的,但是他们的专长是帮助其他平台对接新浪t.cn短网址的接口。因为现在做短信、微信、微博等营销推广。真的是缺少不了短链接的使用。尤其是稳定快速的新浪短网址!

6、麻花短网址

平台官网:http://mhdwz.cn/

短链是需要一个长期稳定服务、请使用较大公司的短链服务,麻花短网址是直接调用的新浪微博的API接口。麻花短网址提供的新浪微博短链接API接口提供最简单的json接口,直接返回内容以及最简单的在线批量压缩工具,无需技术功底,轻松使用。

7、酷牛短链接

平台官网:http://knurl.cn

酷牛短链接是一款新浪短网址(t.cn)和腾讯短链接(url.cn)的在线生成工具,将长链接转换成t.cn和url.cn格式的短链接。

8、雷虎短链

平台官网:http://tttool.cn

雷虎短链不生产短链,雷虎只是短链的搬运工,对接两大平台短链接口生成新浪和腾讯短链为什么不和其他小台子一样,自己做短链?大平台稳定,兼容性好,速度快,不易被封杀等诸多优点,秒杀小台子雷虎短链可直接免费在线生成短链。

9、米狗短网址

平台官网:http://migourl.cn

1.米狗短网址提供稳定便捷的在线生成短网址服务2.在线批量生成和转换生成多条短网址并下载生成结果,方便快捷。3对接API接口到第三方系统或者APP,米狗提供各种API返回格式,也可根据情况定制返回格式。4.二维码:米狗可提供长链接直接转换成短链并生成二维码(原始长链接→短链接→二维码)

10、青梅短网址

平台官网:http://qingmeidwz.cn/

青梅短网址作为一款功能强大的短网址短链接生成工具,生成的短网址短链接使用无限制,可在任意PC端和移动端使用,点击无次数限制,且支持java,c,php,python,jquery等市场所有语言。配备了多套备用的短链接生成器,接口永不失效。同时支持新浪,t.cn短网址短链接,腾讯QQ,微信url.cn短链接短网址。

11、木子短网址

平台官网:http://muzidwz.cn

木子短网址是一款使用简单的短链接短网址在线生成工具,为用户提供短信营销,微信营销,大品牌推广,电商行业,H5,社群等营销中所需的网址缩短服务,包括短链接单个生成、短链接批量生成、支持高频的短网址api接口。具有精简文案,美化推广界面,稳定防劫持,数据统计分析等功能。

12、雪娃短链接

平台官网:http://xuewaurl.cn

雪娃短链接是一款在专业性上面非常强的产品,从其网站的介绍上就可以看出。功能,应用,问题,一一详尽的列出,让用户一目了然。以一个专业的角度为用户解答了各式各样的问题。让您在使用过程中,再无任何忧虑。最难得可贵的是雪娃短链接使用起来还非常之方便,在线一键生成,接口api调用批量生成,都可支持。

13、雨林短网址

平台官网:http://yldwz.cn

雨林短网址采用新浪、腾讯官方API接口,强大的多功能API,简单易用,质量高官网提供强技术支持,99.9% SLA服务稳定安全可靠的校验机制,提高链接安全性。

14、福牛短链接

平台官网:http://minurl.cn

福牛短网址服务可以帮助你把一个长网址缩短,方便你在社交网络和第三方平台上分享链接,投放广告等等。 我们提供超简单的方式使用短网址服务,采用新浪、腾讯官方API接口,输入你要缩短的原网址,生成对应的短网址。你还可以调用新浪、腾讯官方API接口API服务,查看数据统计与分析……更多功能,等你来探索!

15、九鱼短链

平台官网:http://smallurl.cn

九鱼短链基于沙盒安全技术,可靠安全。短链接接口采用新浪t.cn、腾讯url.cn是目前互联网上最稳定、最安全、最快速的短网址服务,一键生成安全绿标的短网址,永不失效,给用户带来最好的短网址体验以及努力打造绿色互联网环境。

查看原文

赞 0 收藏 0 评论 0

欧昊 发布了文章 · 2019-10-28

线程封闭之栈封闭和ThreadLocal

线程封闭

  在多线程的环境中,我们经常使用锁来保证线程的安全,但是对于每个线程都要用的资源使用锁的话那么程序执行的效率就会受到影响,这个时候可以把这些资源变成线程封闭的形式。

 1、栈封闭

  所谓的栈封闭其实就是使用局部变量存放资源,我们知道局部变量在内存中是存放在虚拟机栈中,而栈又是每个线程私有独立的,所以这样可以保证线程的安全。

 2、ThreadLocal

  我们先看ThreadLocal和线程Thread的关系图。

  

   再看下ThreadLocal的操作,以get为例

public T get() {        // 当前线程        Thread t = Thread.currentThread();   // 拿到当前线程的threadLocalMap,即上图中的map引用        ThreadLocalMap map = getMap(t);        if (map != null) {            // 拿到当前ThreadLocal为Key对应的Entry,里面做了防止内存泄漏的处理            ThreadLocalMap.Entry e = map.getEntry(this);            if (e != null) {                @SuppressWarnings("unchecked")                T result = (T)e.value;                return result;            }        }        // 如果为null设置默认值        return setInitialValue();    }

  如上面get方法的源码所示,在调用threadLocal.get()方法的时候,threadLocal拿到当前线程中ThreadLocalMap中以threadLocal自身为key对应的entry,在这个getEntry方法中里面做了内存泄漏的处理,大概处理逻辑就是如果threadLocal对应的Entry为null的话,让这个entry的value为null并且map中threadLocal对应下标置null,如果不为null的话返回,否则的话则调用默认值方法setInitialValue()

 private T setInitialValue() {        T value = initialValue();        Thread t = Thread.currentThread();        ThreadLocalMap map = getMap(t);        if (map != null)            map.set(this, value);        else            createMap(t, value);        return value;    }  // 默认null实现 protected T initialValue() {        return null;  }

  setInitialValue()方法逻辑比较简单,这里不多赘述,值得注意的是里面调用的initialValue(),并没有任何的实现,所以我们使用threadLocal的时候一般都会选择重写实现这个方法。

 // 这里main方法测试,所以用static修饰,会延长threadLocal的生命周期,有内存泄漏的风险,一般作为成员变量就足够了 public static ThreadLocal<String> threadLocal = new ThreadLocal<String>(){        @Override        protected String initialValue() {            return "init string from initialValue method";        }    };    public static void main(String[] args) throws InterruptedException {        // 未放入value直接调用get        System.err.println("invoke get before any set:" + threadLocal.get());        threadLocal.set("test");        System.err.println("before thread start : " + threadLocal.get());        new Thread(() -> {            // 对相同的threadLocal对象放入值            threadLocal.set("test in thread");            System.err.println("In thread[" + Thread.currentThread().getName() + "] threadLocal value : " + threadLocal.get());        }).start();        TimeUnit.SECONDS.sleep(1);        // 证明threadLocal中的value不在线程中共享        System.err.println("after thread value : " + threadLocal.get());    }result:  
  结合这个小程序和上面的图就可以对threadLocal有一个大概的理解了。其他的方法如set、remove等方法都大同小异,可以结合图片去看源码,这里不再赘述。

  关于内存泄漏的问题

    1、在threadLocal的get、set、remove方法中,其对本身可能发生的内存泄漏都做了处理,逻辑上面也提到如果对应entry为null,将其value置null,将map中对应下标引用置null。

    2、而对于threadLocal中这个对象的泄漏来说,则是采用弱引用的方式来实现,在上面的图中,我用虚线来表示弱引用,弱引用的意思是在JVM进行垃圾回收的时候这个引用会被回收(无论内存足够与否);试想一下,如果使用强引用并且栈中的引用消失了,那么在线程结束之前这个threadLocal对象不会被回收且无法访问,也就是造成内存泄漏。

 3、Java四种引用的简要概述

  上面在ThreadLocal提到了弱引用,这里顺便简单的说下Java中的四种引用。

  1. 强引用:指new出来的对象,一般没有特别申明的对象都是强引用。这种对象只有在GCroots找不到它的时候才会被回收。
  2. 软引用(SoftReference的子类):GC后内存不足的情况将只有这种引用的对象回收。
  3. 弱引用(WeakReference的子类):GC时回收只有此引用的对象(无论内存是否不足)。
  4. 虚引用(PhantomReference子类):没有特别的功能,类似一个追踪符,配合引用队列来记录对象何时被回收。(实际上这四种引用都可以配合引用队列使用,只要在构造方法中传入需要关联的引用队列就行,在对象调用finalize方法的时候会被写入到队列当中)
若有不正之处,望指出!
查看原文

赞 0 收藏 0 评论 0

欧昊 发布了文章 · 2019-10-26

10款超棒的新浪短网址在线生成(长链接转成 t.cn 短链接 )工具

长链接转成新浪(t.cn)短链接的需求几乎每天都有几百万次以上,然好用的在线工具就很吃香了,今天就给大家整理15个国内最好用的新浪短网址在线生成工具。

1、青桃短链接

平台官网:http://qturl.cn

青桃短链接是一个老牌的第三方短链接服务平台了。对于其技术支持和服务质量来说,可以说是国内最好的短链接服务商之一。

该平台可让您通过简单地复制粘贴链接就能缩短你的长链接,您在几秒钟内就可以设置一个新的短链接域名,用于包装你的长链接,且无需验证码或额外的验证。

注册成为会员后,您还能获得更多的功能选择,例如可以批量生成短链接,再例如可以创建防墙短链接等。长期以来,青桃短链接一直是最好的短链接生成工具之一,这来源于其产品高质量和技术的可靠性。

2、快鸟短网址

平台官网:http://kndwz.com

随着移动SEO的重要性越来越重要,在推广的时候如果优化和缩短网页链接可以获得更好的访问。快鸟短网址是一个便捷的长链接缩短工具,用户可以免费使用该平台的接口生成新浪短链接,快鸟短网址不仅可以生成短链接,还支持批量缩短链接,与其他应用程序集成以及短链接跟踪,这对于企业级用户来说,使用起来不仅高效也很便捷。这些特性使它成为一个高质量的软件工具,可更好的帮助你提升推广的效率。

3、蓝鸟短链接

平台官网:http://lnurl.cn

蓝鸟短链接是目前国内最好的第三方短链接生成服务商之一。任何用户都可以匿名使用该平台的短链接接口缩短自己的网址,你也可以跟踪生成短连接的访问量。

但平台的免费接口生成次数是有限的,如果您要订阅无限次数或更多次数,可以开通高级账户,开通后则可以根据自己的需求批量生成更多的短链接了,以及能追踪链接的点击次数和基本数据报告。由于它稳定的技术和便利的链接跟踪,蓝鸟短链接可能是目前排名前三的短链接生成器。

4、冷狗短链接

平台官网:http://dogdwz.cn/

冷狗短链接那边提供最新的新浪T.CN短链接在线生成服务,每天都可以去免费生成新的微博T.CN短网址,他们采用的是新浪微博的官方的原生态生成接口,安全、稳定、一次生成永久使用。。

5、麦云短链接

平台官网:http://maiyurl.cn/

麦云短链接的官网也是可以免费生成短链接的,但是他们的专长是帮助其他平台对接新浪t.cn短网址的接口。因为现在做短信、微信、微博等营销推广。真的是缺少不了短链接的使用。尤其是稳定快速的新浪短网址!

6、酷牛短链接

平台官网:http://knurl.cn

酷牛短链接是一款新浪短网址(t.cn)和腾讯短链接(url.cn)的在线生成工具,将长链接转换成t.cn和url.cn格式的短链接。

7、雷虎短链

平台官网:http://tttool.cn

雷虎短链不生产短链,雷虎只是短链的搬运工,对接两大平台短链接口生成新浪和腾讯短链为什么不和其他小台子一样,自己做短链?大平台稳定,兼容性好,速度快,不易被封杀等诸多优点,秒杀小台子雷虎短链可直接免费在线生成短链。

8、青梅短网址

平台官网:http://qingmeidwz.cn/

青梅短网址作为一款功能强大的短网址短链接生成工具,生成的短网址短链接使用无限制,可在任意PC端和移动端使用,点击无次数限制,且支持java,c,php,python,jquery等市场所有语言。配备了多套备用的短链接生成器,接口永不失效。同时支持新浪,t.cn短网址短链接,腾讯QQ,微信url.cn短链接短网址。

9、木子短网址

平台官网:http://muzidwz.cn

木子短网址是一款使用简单的短链接短网址在线生成工具,为用户提供短信营销,微信营销,大品牌推广,电商行业,H5,社群等营销中所需的网址缩短服务,包括短链接单个生成、短链接批量生成、支持高频的短网址api接口。具有精简文案,美化推广界面,稳定防劫持,数据统计分析等功能。

10、雨林短网址

平台官网:http://yldwz.cn

雨林短网址采用新浪、腾讯官方API接口,强大的多功能API,简单易用,质量高官网提供强技术支持,99.9% SLA服务稳定安全可靠的校验机制,提高链接安全性。

查看原文

赞 0 收藏 0 评论 0

欧昊 发布了文章 · 2019-10-24

浅谈实现并发的几种方式

java实现并发的七种方式
Java多线程实现方式大概可以有七种实现方式:继承Thread类、实现Runnable接口、实现Callable接口、使用线程池、使用Timer定时器、内部类实现、jdk1.8的stream

1.继承Thread类
Thread类本质上是实现了Runnable接口的一个实例,代表一个线程的实例。启动方法就是通过继承了Thread类的start()实例方法。执行run()方法(重写的)。就可以启动新线程并执行自己定义。例如:

//实现方法的类
public class Demo1 extends Thread {

public void run(){
    System.out.println("继承Thread类");
}

}

//执行的方法
public static void main(String[] args) {

    Demo1 demo1=new Demo1();
    demo1.start();

}

执行结果:
继承Thread类

2.实现Runnable接口
由于java是单继承的,那么在平时开发中就提倡使用接口的方式实现。则需要实现多线程的类通过实现Runnable接口的run方法。通过Thread的start()方法进行启动,例如:

//实现的方法类:
public class Demo2 implements Runnable {

@Override
public void run() {
    System.out.println("实现runnable接口");
}

//执行方法:
public static void main(String[] args) {

    Demo2 demo2=new Demo2();
    Thread thread=new Thread(demo2);
    thread.start();

}

执行结果:
实现runnable接口

3.通过内部类的方式实现多线程
直接可以通过Thread类的start()方法进行实现,因为Thread类实现了Runnable接口,并重写了run方法,在run方法中实现自己的逻辑,例如:

//这里通过了CountDownLatch,来进行阻塞,来观察两个线程的启动,这样更加体现的明显一些:
public static CountDownLatch countDownLatch=new CountDownLatch(2);

public static void main(String[] args) {
    new Thread(()->{
        countDownLatch.countDown();
        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("T1");
    }).start();

    new Thread(()->{
        countDownLatch.countDown();
        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("T2");
    }).start();

}

结果:
第一次:
T2
T1
第二次:
T1
T2

4.通过实现Callable接口
通过实现Callable接口的call方法,可以通过FutureTask的get()方法来获取call方法中的返回值,具体实现如下:

//实现类方法:
public class Demo3 implements Callable {

@Override
public Object call() {
    return "1";
}

}

//执行方法:
public static void main(String[] args) {

    //创建实现类对象
    Callable demo3=new Demo3();
    FutureTask oneTask = new FutureTask(demo3);
    Thread thread=new Thread(oneTask);
    thread.start();
    Object o = null;
    try {
        //获取返回值
        o = oneTask.get();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }
    System.out.println(o);

}

执行结果:

5.通过线程池来实现多线程
线程池可以根据不同的场景来选择不同的线程池来进行实现,这里我仅使用其中之一进行演示,后续会单独写一个线程池相关的单独介绍:

//实现代码如下:
public class Demo5 {

public static void main(String[] args) {
    ExecutorService executorService = Executors.newFixedThreadPool(5);
    for(int i=0;i<5;i++){
        int finalI = i;
        executorService.execute(()-> {
            System.out.println(finalI);
        });
    }
}

}

执行结果:

6.通过Timer定时器来实现多线程
就Timer来讲就是一个调度器,而TimerTask呢只是一个实现了run方法的一个类,而具体的TimerTask需要由你自己来实现,同样根据参数得不同存在多种执行方式,例如其中延迟定时任务这样:

//具体代码如下:
public class Demo6 {

public static void main(String[] args) {
    Timer timer=new Timer();
    timer.schedule(new TimerTask(){
        @Override
        public void run() {
            System.out.println(1);
        }
    },2000l,1000l);
}

}

执行结果:

7.jdk1.8通过stream实现多线程
jdk1.8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。
Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。
具体简单代码实现如下:

//代码实现:
public class Demo7 {

//为了更形象体现并发,通过countDownLatch进行阻塞
static CountDownLatch countDownLatch=new CountDownLatch(6);
public static void main(String[] args) {
    List list=new ArrayList<>();
    list.add(1);
    list.add(2);
    list.add(3);
    list.add(4);
    list.add(5);
    list.add(6);

    list.parallelStream().forEach(p->{
        //将所有请求在打印之前进行阻塞,方便观察
        countDownLatch.countDown();
        try {
            System.out.println("线程执行到这里啦");
            Thread.sleep(10000);
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(p);
    });
}

}

执行结果:
执行开始,所有请求都进入打印了
线程执行到这里啦
线程执行到这里啦
线程执行到这里啦
线程执行到这里啦
线程执行到这里啦
线程执行到这里啦
等待10s后同时打印出结果,无序的打印结果如下:

查看原文

赞 0 收藏 0 评论 0

欧昊 发布了文章 · 2019-10-24

转发和重定向的过程和区别

**转发  req.getRequestDispatcher("/要跳转的地址").forward(req, resp);
**
转发的过程:(以servlet和jsp为例)

浏览器首先发送一个请求到服务器端,服务器端发现匹配的 servlet,并指定它去执行,当这个 servlet 执行完之后,它要调用getRequestDispacther()方法,把请求转发给指定的jsp页面,整个流程都是在服务器端完成的,而且是在同一个请求里面完成的,因此 servlet 和 jsp 共享的是同一个request,在 servlet 里面存放的所有东西,在jsp页面中都能取出来。整个过程是一个请求,一个响应。

易错点:

a)地址栏不会改变

b)转发只能转发到当前web应用内的资源

c)在转发过程中,可以把数据保存到request域对象中(因为转发使用同一个request域)

d)转发是在服务器端的跳转,浏览器并不知情

 

重定向  resp.sendRedirect("/要跳转的地址");

重定向的过程:(以servlet和jsp为例)

浏览器发送一个请求到服务器端,服务器端匹配servlet,这都和请求转发一样,servlet 处理完之后调用了sendRedirect()这个方法,这个方法是response的方法,所以当这个servlet处理完之后,看到response.senRedirect()方法,立即向浏览器返回这个响应(包含响应报头和新的URL地址),响应告诉浏览器你必须要再发送一个请求,去访问 jsp页面,紧接着浏览器收到这个请求后,立刻又重新发出一个新的请求,去请求 jsp页面。这两个请求互不干扰,相互独立,在前面request里面 setAttribute() 的任何东西,在后面的request里面都获取不了。可见,在重定向里面是两个请求,两个响应。

易错点:

a)地址栏会改变,变成重定向后的地址

b)重定向可以跳转到当前web应用或其他web应用,甚至是外部域名网站

c)不能在重定向的过程中,把数据保存到request中(因为发送第二个request请求时,第一个的request域会失效)

d) 重定向是在浏览器的跳转,浏览器知情

 

转发和重定向的区别:

转发是在服务器端的跳转,就是浏览器向服务器发送一个请求,服务器直接将请求相关的参数的信息原封不动的传递到该服务器的其他jsp或servlet去处理。而重定向是在浏览器的跳转,服务器会返回给浏览器一个响应报头和新的URL地址,原来的参数或者其他的一些信息,如果服务器端没有特别处理就不存在了,浏览器会访问新的URL所指向的servlet 或 jsp。
 

注意点:如果要使用request域对象进行数据共享,只能使用转发!!!

查看原文

赞 1 收藏 1 评论 0

欧昊 关注了用户 · 2019-10-24

程序员cxuan @cxuan

Java后端开发,欢迎关注个人微信公众号 Java建设者 及时关注最新技术文章。

关注 7277

欧昊 关注了专栏 · 2019-10-24

JowayYoung谈前端

谢谢曾经努力的自己,欢迎关注公众号『 IQ前端 』,一个专注于CSS/JS开发技巧的前端公众号,更多前端小干货等着你喔

关注 4056

欧昊 关注了用户 · 2019-10-24

呆鸟 @jaystone776

关注 690

认证与成就

  • 获得 1 次点赞
  • 获得 1 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 1 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2019-10-24
个人主页被 70 人浏览