首页
归档
留言
广告合作
友链
美女主播
Search
1
博瑞GE车机升级/降级
5,146 阅读
2
Mac打印机设置黑白打印
4,517 阅读
3
修改elementUI中el-table树形结构图标
4,516 阅读
4
Mac客户端添加腾讯企业邮箱方法
4,351 阅读
5
intelliJ Idea 2022.2.X破解
4,060 阅读
Java
HarmonyOS Next
Web前端
微信开发
开发辅助
App开发
数据库
随笔日记
登录
/
注册
Search
标签搜索
Spring Boot
Java
Spring Cloud
Mac
mybatis
WordPress
Nacos
Spring Cloud Alibaba
Mybatis-Plus
jQuery
Java Script
asp.net
微信小程序
Sentinel
UniApp
MySQL
asp.net core
IntelliJ IDEA
Jpa
树莓派
Laughing
累计撰写
570
篇文章
累计收到
1,424
条评论
首页
栏目
Java
HarmonyOS Next
Web前端
微信开发
开发辅助
App开发
数据库
随笔日记
页面
归档
留言
广告合作
友链
美女主播
搜索到
33
篇与
的结果
2021-06-06
Java线程间的通信之等待/通知机制
上⾯⼀种基于“锁”的⽅式,线程需要不断地去尝试获得锁,如果失败了,再继续尝试。这可能会耗费服务器资源。⽽等待/通知机制是另⼀种⽅式。Java多线程的等待/通知机制是基于Object类的wait()⽅法和notify(),notifyAll()⽅法来实现的。[alt type="success"]notify()⽅法会随机叫醒⼀个正在等待的线程,⽽notifyAll()会叫醒所有正在等待的线程。[/alt]前⾯我们讲到,⼀个锁同⼀时刻只能被⼀个线程持有。⽽假如线程A现在持有了⼀个锁lock并开始执⾏,它可以使⽤lock.wait() 让⾃⼰进⼊等待状态。这个时候,lock这个锁是被释放了的。这时,线程B获得了lock这个锁并开始执⾏,它可以在某⼀时刻,使⽤lock.notify(),通知之前持有lock锁并进⼊等待状态的线程A,说“线程A你不⽤等了,可以往下执⾏了”。[alt type="warning"]需要注意的是,这个时候线程B并没有释放锁lock,除⾮线程B这个时候使⽤lock.wait()释放锁,或者线程B执⾏结束⾃⾏释放锁,线程A才能得到lock锁。[/alt]package com.company; import java.util.stream.IntStream; public class WaitAndNotify { private static Object lock = new Object(); static class ThreadA implements Runnable{ @Override public void run() { synchronized (lock){ IntStream.range(1,5).forEach(i->{ System.out.println("ThreadA:"+i); lock.notify(); try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } }); } } } static class ThreadB implements Runnable{ @Override public void run() { synchronized (lock){ IntStream.range(1,5).forEach(i->{ System.out.println("ThreadB:"+i); lock.notify(); try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } }); } } } public static void main(String[] args) throws InterruptedException { new Thread(new ThreadA()).start(); Thread.sleep(1000); new Thread(new ThreadB()).start(); } } [alt type="info"]需要注意的是等待/通知机制使⽤的是使⽤同⼀个对象锁,如果你两个线程使⽤的是不同的对象锁,那它们之间是不能⽤等待/通知机制通信的。[/alt]
2021年06月06日
839 阅读
0 评论
1 点赞
2021-06-06
Java线程间的通信之锁与同步
在Java中,锁的概念都是基于对象的,所以我们⼜经常称它为对象锁。线程和锁的关系,我们可以⽤婚姻关系来理解。⼀个锁同⼀时间只能被⼀个线程持有。也就是说,⼀个锁如果和⼀个线程“结婚”(持有),那其他线程如果需要得到这个锁,就得等这个线程和这个锁“离婚”(释放)。在我们的线程之间,有⼀个同步的概念。什么是同步呢,假如我们现在有2位正在抄暑假作业答案的同学:线程A和线程B。当他们正在抄的时候,⽼师突然来修改了⼀些答案,可能A和B最后写出的暑假作业就不⼀样。我们为了A,B能写出2本相同的暑假作业,我们就需要让⽼师先修改答案,然后A,B同学再抄。或者A,B同学先抄完,⽼师再修改答案。这就是线程A,线程B的线程同步。可以以解释为:线程同步是线程之间按照⼀定的顺序执⾏。为了达到线程同步,我们可以使⽤锁来实现它。我们先来看看⼀个⽆锁的程序:package com.company; import java.util.stream.IntStream; public class NoneLock { static class ThreadA implements Runnable { @Override public void run() { IntStream.range(1, 100).forEach(i -> { System.out.println("threadA:" + i); }); } } static class ThreadB implements Runnable { @Override public void run() { IntStream.range(1, 100).forEach(i -> { System.out.println("threadB:" + i); }); } } public static void main(String[] args) { new Thread(new ThreadA()).start(); new Thread(new ThreadB()).start(); } } 某次的运行结果那我现在有⼀个需求,我想等A先执⾏完之后,再由B去执⾏,怎么办呢?最简单的⽅式就是使⽤⼀个“对象锁”:package com.company; import java.util.stream.IntStream; public class ObjectLock { private static final Object lock = new Object(); static class ThreadA implements Runnable { @Override public void run() { synchronized (lock) { IntStream.range(1, 100).forEach(i -> { System.out.println("threadA:" + i); }); } } } static class ThreadB implements Runnable { @Override public void run() { synchronized (lock) { IntStream.range(1, 100).forEach(i -> { System.out.println("threadB:" + i); }); } } } public static void main(String[] args) throws InterruptedException { new Thread(new ThreadA()).start(); Thread.sleep(10); new Thread(new ThreadB()).start(); } }
2021年06月06日
888 阅读
0 评论
0 点赞
2020-12-28
java8 list统计(求和、最大、最小、平均)
list.stream().mapToDouble(User::getHeight).sum()//和list.stream().mapToDouble(User::getHeight).max()//最大list.stream().mapToDouble(User::getHeight).min()//最小list.stream().mapToDouble(User::getHeight).average()//平均值
2020年12月28日
1,249 阅读
0 评论
0 点赞
2020-11-20
Java金额格式化去掉小数点后不需要的零
平时我们在开发过程中,金额一般都是格式化成特定位数,比如人民币金额一般格式化成10.25元这种,但是有时候,我们在打印一些小数时,不希望显示小数点后无用的0,比如3.20输出3.2,这时候就需要使用NSFormat类了。 BigDecimal bigDecimal = new BigDecimal("3.20"); NumberFormat numberFormat = NumberFormat.getInstance(); System.out.println(numberFormat.format(bigDecimal));
2020年11月20日
1,561 阅读
0 评论
0 点赞
2020-09-26
Mac查看已安装的jdk版本以及目录
最近学习https,想着借助java自带的keytool配置一下springboot的htts,因为需要进入%java_home%/bin。查看java目录命令如下/usr/libexec/java_home -V
2020年09月26日
1,510 阅读
0 评论
1 点赞
2019-07-10
修改tomcat配置映射去掉URL中的项目名
Tomcat文件目录conf/server.xml:host节点下添加<Context path="" docBase="projectname" debug="0" reloadable="true"/> 注意:在项目部署了以后在修改,修改了以后重启tomcat,修改了以后会影响到tomcat的控制台页面的运行 <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context path="" docBase="projectname" debug="0" reloadable="true"/> </host>
2019年07月10日
1,247 阅读
0 评论
0 点赞
2018-04-01
Mac下IntelliJ IDEA使用Tomcat报error=13, permission denied
打开Terminal,找到catalina.sh所在的文件夹下;输入chmod a+x catalina.sh即可
2018年04月01日
1,449 阅读
0 评论
1 点赞
2017-11-13
jsp包含页面的方法
在jsp中,我们可以通过两种方式包含页面,简单点的方法是包含一个或者几个静态页面,稍微高级一点的方式是包含动态页面,甚至像动态页面传递参数,下面我们针对这两种方式分别进行介绍。包含静态页面这里所谓的静态页面其实有点不太合适,我们也可以包含jsp页面,但是无法传递参数。包含静态页面通过<%@include file="" %>指令进行的。需要包含的页面index.jsp<%@include file="include.jsp" %> 被包含的页面include.jsp<h1>Include Page</h1> <h2><%=request.getParameter("included") %></h2>我们可以看一下下面的输出页面,由于无法传递参数,所以我们在页面获取的request的参数值是null包含动态页面并传递参数继续我们刚才的代码,我们修改index.jsp代码如下<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" session="true" isThreadSafe="true" autoFlush="true" info="我是首页" errorPage="errorPage.jsp"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>首页</title> </head> <body> <form action="index.jsp" name="form1" method="post"> <input type="text" name="userName" id="UserName"> <input type="submit" value="提交"> <% request.setCharacterEncoding("UTF-8"); String userName = request.getParameter("userName"); if(userName==null){ out.println("请输入用户名"); }else if(userName==""){ out.println("(づ ̄3 ̄)づ╭❤~,输入名称呀"); } else{ out.println(userName); } %> <%-- 注释 <%@include file="include.jsp" %> --%> <jsp:include page="include.jsp"> <jsp:param value="我被成功包含进来了" name="included"/> </jsp:include> </form> </body> </html>
2017年11月13日
1,197 阅读
0 评论
1 点赞
2017-11-11
JSP标签
JSP标签库,是使用XML语法格式完成程序操作的一种方法,其使用的语法类似于JavaBean的使用语法,于JavaBean一样,都可以通过类完成复杂的操作,而且最大的优势就是按照HTML标签的形式标签,这样可以方便的处理JSP页面的数据显示。定义空标签继承TagSupport类package me.lisen.JavaEEStudy; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; public class HelloTag extends TagSupport { @Override public int doStartTag() throws JspException { JspWriter jspWriter = super.pageContext.getOut(); try{ jspWriter.write("<h1>Hello,World!</h1>"); }catch (Exception e){ e.printStackTrace(); } return TagSupport.SKIP_BODY;//表示标签体为空 } }定义标签描述文件 /WEB-INF/hellotag.tld<?xml version="1.0" encoding="ISO-8859-1"?> <taglib xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd" version="2.1"> <tlib-version>1.0</tlib-version> <short-name>firsttag</short-name> <uri>https://www.xiangcaowuyu.net</uri> <!-- Invoke 'Generate' action to add tags or functions --> <tag> <name>hello</name> <tag-class>me.lisen.JavaEEStudy.HelloTag</tag-class> <body-content>empty</body-content> </tag> </taglib>使用标签<%@ page import="java.awt.*" %> <%@ page import="java.util.ArrayList" %><%-- Created by IntelliJ IDEA. User: lisen Date: 2017/11/10 Time: 下午12:43 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@page import="me.lisen.JavaEEStudy.Dpt" %> <%@taglib prefix="mytag" uri="/WEB-INF/hellotag.tld" %><%--定义标签--%> <html> <head> <title>首页</title> <script src="js/jquery-3.2.1.js" type="text/javascript"></script> <script src="css/bootstrap/js/bootstrap.js" type="text/javascript"></script> <link href="css/bootstrap/css/bootstrap.css" rel="stylesheet"> <script src="js/bootstrap-fileinput/js/fileinput.js" type="text/javascript"></script> <link href="js/bootstrap-fileinput/css/fileinput.css" rel="stylesheet"> <script src="js/bootstrap-fileinput/js/locales/zh.js" type="text/javascript"></script> </head> <body> <mytag:hello/><%--使用标签--%> </body> </html>如果标签描述文件的路径比较深,我们通过修改web.xml修改映射,然后调用对应的uri获取标签描述文件的位置首先,我们修改web.xml文件,对标签描述文件进行映射<jsp-config> <taglib> <taglib-uri>hellotagtld</taglib-uri> <taglib-location>/WEB-INF/hellotag.tld</taglib-location> </taglib> </jsp-config>修改标签引用的uri<%@taglib prefix="mytag" uri="hellotagtld" %><%--定义标签--%> 定义一个有属性的标签。修改继承的类package me.lisen.JavaEEStudy; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; import java.text.SimpleDateFormat; import java.util.Date; public class HelloTag extends TagSupport { private String formatStr; public void setFormatStr(String formatStr) { this.formatStr = formatStr; } public String getFormatStr() { return formatStr; } @Override public int doStartTag() throws JspException { JspWriter jspWriter = super.pageContext.getOut(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat(formatStr); try{ jspWriter.write(simpleDateFormat.format(new Date())); }catch (Exception e){ e.printStackTrace(); } return TagSupport.SKIP_BODY;//表示标签体为空 } }修改tld文件,加入定义的属性<?xml version="1.0" encoding="ISO-8859-1"?> <taglib xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd" version="2.1"> <tlib-version>1.0</tlib-version> <short-name>firsttag</short-name> <uri>https://www.xiangcaowuyu.net</uri> <!-- Invoke 'Generate' action to add tags or functions --> <tag> <name>hello</name> <tag-class>me.lisen.JavaEEStudy.HelloTag</tag-class> <body-content>empty</body-content> <attribute> <name>formatStr</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>修改调用方法,传入属性<mytag:hello formatStr="yyyy-MM-dd"/><%--使用标签--%>
2017年11月11日
1,252 阅读
0 评论
1 点赞
1
2
3