夜光序言:
曾经为了一个人倾心过,后来才发现那样不值得;有时候,不得不心狠一点,这样自己才会快乐一点;不需要给自己找很多的麻烦,也许对方并不需要你的关心。
正文:
以道御术 / 以术识道
package 夜光第二部分.案例3;
import java.util.Arrays;
import java.util.List;
//lambda表达式 语法
public class Demo8 {
public static void main(String[] args) {
//我们写一个主函数来调用一下
//下面就构建了一个长度为4的,元素有其中四个的集合
List<Integer> values = Arrays.asList(10,20,30,40);
//接下来,我们调用下
int res = new Demo8().add(values);
System.out.println("夜光:计算的结果为" + res);
}
public int add(List<Integer> values){
//迭代出来的元素a 等于 a
//再通过一个sum方法即可
return values.parallelStream().mapToInt(a -> a).sum(); //并发的
}
}
代码更加优化了嗯
package 夜光第二部分.案例3;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
//lambda表达式 语法
public class Demo9 {
public static void main(String[] args) {
//我们写一个主函数来调用一下
//下面就构建了一个长度为4的,元素有其中四个的集合
List<Integer> values = Arrays.asList(10,20,30,40);
//接下来,我们调用下
int res = new Demo9().add(values);
System.out.println("夜光:计算的结果为" + res);
// List<Object> l = new ArrayList<>();
// for (Integer i : values){ //很强大,可以把类型给猜出来
//
// }
}
public int add(List<Integer> values){
//迭代出来的元素a 等于 a
//再通过一个sum方法即可
// return values.parallelStream().mapToInt(a -> a).sum(); //并发的
values.parallelStream().forEachOrdered(System.out :: println); //println方法
return values.parallelStream().mapToInt(i -> i*2).sum();
}
}
-DarchetypeCatalog=internal
可以用常量
package Java字节码角度看线程安全问题;
//夜光
public class Sequence {
private int value;
public int getNext(){
return value++;
}
public static void main(String[] args) {
//我们调用的时候
// new Sequence().getNext();
Sequence s = new Sequence();
while(true){ //多次调用
System.out.println(s.getNext());
}
}
}
package Java字节码角度看线程安全问题;
//夜光
public class Sequence {
private int value;
public int getNext(){
return value++;
}
public static void main(String[] args) {
//我们调用的时候
// new Sequence().getNext();
//1. 下面这种方式面对多线程,会出现不可预期的问题
// Sequence s = new Sequence();
// while(true){ //多次调用
// System.out.println(s.getNext());
// }
//2. 我们看看下面这种方式
Sequence s = new Sequence();
new Thread(new Runnable() {
@Override
public void run() {
//下面,我们不停地去调用生成器
while (true){
System.out.println(Thread.currentThread().getName()
+""+s.getNext());
try {
Thread.sleep(1000); //休息一会儿
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
//然后,我们重写多个
//嗯唔
//第二个线程
new Thread(new Runnable() {
@Override
public void run() {
//下面,我们不停地去调用生成器
while (true){
System.out.println(Thread.currentThread().getName()
+""+s.getNext());
try {
Thread.sleep(1000); //休息一会儿
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
//第三个线程
new Thread(new Runnable() {
@Override
public void run() {
//下面,我们不停地去调用生成器
while (true){
System.out.println(Thread.currentThread().getName()
+""+s.getNext());
try {
Thread.sleep(1000); //休息一会儿
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
}
上面这种方式会出现线程安全问题
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
//夜光
@WebServlet(name = "Hello")
public class Hello extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置响应内容类型
response.setContentType("text/html");
//设置逻辑实现
PrintWriter out = response.getWriter();
out.println("<h1>Servlet后台</h1>");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>Hello</servlet-name>
<servlet-class>Hello</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/Hello</url-pattern>
</servlet-mapping>
</web-app>