Java并发性实践清单6.2
下面的代码片段来自Java并发实践()中的清单6.2Java并发性实践清单6.2,java,concurrency,final,safe-publication,Java,Concurrency,Final,Safe Publication,下面的代码片段来自Java并发实践()中的清单6.2 package net.jcip.examples; 导入java.io.IOException; 导入java.net.ServerSocket; 导入java.net.Socket; /** *ThreadPertaskWeb服务器 * *为每个请求启动新线程的Web服务器 * *@作者Brian Goetz和Tim Peierls */ 公共类ThreadPerTaskWebServer{ 公共静态void main(字符串[]args
package net.jcip.examples;
导入java.io.IOException;
导入java.net.ServerSocket;
导入java.net.Socket;
/**
*ThreadPertaskWeb服务器
*
*为每个请求启动新线程的Web服务器
*
*@作者Brian Goetz和Tim Peierls
*/
公共类ThreadPerTaskWebServer{
公共静态void main(字符串[]args)引发IOException{
ServerSocket=新的ServerSocket(80);
while(true){
最终套接字连接=Socket.accept();
Runnable任务=新的Runnable(){
公开募捐{
HandlerRequest(连接);
}
};
新线程(任务).start();
}
}
专用静态无效句柄请求(套接字连接){
//这里的请求处理逻辑
}
}
在这本书中,final
关键字被加粗,似乎是为了突出它的重要性。在前面的章节中(特别是第3章),final
讨论了线程安全发布。然而,在这个例子中,final
关键字似乎出于不同的原因很重要,主要是因为Java的“闭包”行为-
我说的
final
关键字纯粹是为了这个目的,而安全发布与它在这里的用法无关,对吗?你说得对。从Java8开始,您也可以省略final
,因为Java8有“effectivefinal”的概念,如果您在初始化后不修改变量,则该概念适用
作为:
对线程的start()
调用发生在线程中的任何操作之前
启动线程
一般来说,关于发生在恋爱之前的事情,它说:
两个动作可以由“发生在之前”关系排序。如果有
动作发生在另一个动作之前,然后第一个动作对和可见
在第二天之前订购
调用start()
之前发生的任何事情都保证在Runnable
任务中可见
package net.jcip.examples;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
* ThreadPerTaskWebServer
* <p/>
* Web server that starts a new thread for each request
*
* @author Brian Goetz and Tim Peierls
*/
public class ThreadPerTaskWebServer {
public static void main(String[] args) throws IOException {
ServerSocket socket = new ServerSocket(80);
while (true) {
final Socket connection = socket.accept();
Runnable task = new Runnable() {
public void run() {
handleRequest(connection);
}
};
new Thread(task).start();
}
}
private static void handleRequest(Socket connection) {
// request-handling logic here
}
}