「java堵塞模式」java阻塞状态

博主:adminadmin 2023-01-25 20:48:07 433

本篇文章给大家谈谈java堵塞模式,以及java阻塞状态对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

什么是阻塞式和非阻塞io流?

阻塞IO:socket 的阻塞模式意味着必须要做完IO 操作(包括错误)才会返回。

非阻塞IO:非阻塞模式下无论操作是否完成都会立刻返回,需要通过其他方式来判断具体操作是否成功。

两者区别:

所谓阻塞方式的意思是指, 当试图对该文件描述符进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待 状态, 直到有东西可读或者可写为止。

对于非阻塞状态, 如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等待 。

一种常用做法是:每建立一个Socket连接时,同时创建一个新线程对该Socket进行单独通信(采用阻塞的方式通信)。这种方式具有很高的响应速度,并且控制起来也很简单,在连接数较少的时候非常有效,但是如果对每一个连接都产生一个线程的无疑是对系统资源的一种浪费,如果连接数较多将会出现资源不足的情况。

一种较高效的做法是:服务器端保存一个Socket连接列表,然后对这个列表进行轮询,如果发现某个Socket端口上有数据可读时(读就绪),则调用该socket连接的相应读操作。

如果发现某个 Socket端口上有数据可写时(写就绪),则调用该socket连接的相应写操作;如果某个端口的Socket连接已经中断,则调用相应的析构方法关闭该端口。这样能充分利用服务器资源,效率得到了很大提高。

java如何主动堵塞http通道

controller 中声明的方法返回值 设成void,然后 response.getWriter().write

这样

求一个Java多线程阻塞模式通信的例子

你是要阻塞线程通信还是非阻塞啊?

服务器端

package multithread4;

import java.io.*;

import java.net.*;

import java.util.concurrent.*;

public class EchoServer {

private int port=8000;

private ServerSocket serverSocket;

private ExecutorService executorService; //线程池

private final int POOL_SIZE=4; //单个CPU时线程池中工作线程的数目

private int portForShutdown=8001; //用于监听关闭服务器命令的端口

private ServerSocket serverSocketForShutdown;

private boolean isShutdown=false; //服务器是否已经关闭

private Thread shutdownThread=new Thread(){ //负责关闭服务器的线程

public void start(){

this.setDaemon(true); //设置为守护线程(也称为后台线程)

super.start();

}

public void run(){

while (!isShutdown) {

Socket socketForShutdown=null;

try {

socketForShutdown= serverSocketForShutdown.accept();

BufferedReader br = new BufferedReader(

new InputStreamReader(socketForShutdown.getInputStream()));

String command=br.readLine();

if(command.equals("shutdown")){

long beginTime=System.currentTimeMillis();

socketForShutdown.getOutputStream().write("服务器正在关闭\r\n".getBytes());

isShutdown=true;

//请求关闭线程池

//线程池不再接收新的任务,但是会继续执行完工作队列中现有的任务

executorService.shutdown();

//等待关闭线程池,每次等待的超时时间为30秒

while(!executorService.isTerminated())

executorService.awaitTermination(30,TimeUnit.SECONDS);

serverSocket.close(); //关闭与EchoClient客户通信的ServerSocket

long endTime=System.currentTimeMillis();

socketForShutdown.getOutputStream().write(("服务器已经关闭,"+

"关闭服务器用了"+(endTime-beginTime)+"毫秒\r\n").getBytes());

socketForShutdown.close();

serverSocketForShutdown.close();

}else{

socketForShutdown.getOutputStream().write("错误的命令\r\n".getBytes());

socketForShutdown.close();

}

}catch (Exception e) {

e.printStackTrace();

}

}

}

};

public EchoServer() throws IOException {

serverSocket = new ServerSocket(port);

serverSocket.setSoTimeout(60000); //设定等待客户连接的超过时间为60秒

serverSocketForShutdown = new ServerSocket(portForShutdown);

//创建线程池

executorService= Executors.newFixedThreadPool(

Runtime.getRuntime().availableProcessors() * POOL_SIZE);

shutdownThread.start(); //启动负责关闭服务器的线程

System.out.println("服务器启动");

}

public void service() {

while (!isShutdown) {

Socket socket=null;

try {

socket = serverSocket.accept(); //可能会抛出SocketTimeoutException和SocketException

socket.setSoTimeout(60000); //把等待客户发送数据的超时时间设为60秒

executorService.execute(new Handler(socket)); //可能会抛出RejectedExecutionException

}catch(SocketTimeoutException e){

//不必处理等待客户连接时出现的超时异常

}catch(RejectedExecutionException e){

try{

if(socket!=null)socket.close();

}catch(IOException x){}

return;

}catch(SocketException e) {

//如果是由于在执行serverSocket.accept()方法时,

//ServerSocket被ShutdownThread线程关闭而导致的异常,就退出service()方法

if(e.getMessage().indexOf("socket closed")!=-1)return;

}catch(IOException e) {

e.printStackTrace();

}

}

}

public static void main(String args[])throws IOException {

new EchoServer().service();

}

}

class Handler implements Runnable{

private Socket socket;

public Handler(Socket socket){

this.socket=socket;

}

private PrintWriter getWriter(Socket socket)throws IOException{

OutputStream socketOut = socket.getOutputStream();

return new PrintWriter(socketOut,true);

}

private BufferedReader getReader(Socket socket)throws IOException{

InputStream socketIn = socket.getInputStream();

return new BufferedReader(new InputStreamReader(socketIn));

}

public String echo(String msg) {

return "echo:" + msg;

}

public void run(){

try {

System.out.println("New connection accepted " +

socket.getInetAddress() + ":" +socket.getPort());

BufferedReader br =getReader(socket);

PrintWriter pw = getWriter(socket);

String msg = null;

while ((msg = br.readLine()) != null) {

System.out.println(msg);

pw.println(echo(msg));

if (msg.equals("bye"))

break;

}

}catch (IOException e) {

e.printStackTrace();

}finally {

try{

if(socket!=null)socket.close();

}catch (IOException e) {e.printStackTrace();}

}

}

}

客户端

package multithread4;

import java.net.*;

import java.io.*;

public class AdminClient{

public static void main(String args[]){

Socket socket=null;

try{

socket=new Socket("localhost",8001);

//发送关闭命令

OutputStream socketOut=socket.getOutputStream();

socketOut.write("shutdown\r\n".getBytes());

//接收服务器的反馈

BufferedReader br = new BufferedReader(

new InputStreamReader(socket.getInputStream()));

String msg=null;

while((msg=br.readLine())!=null)

System.out.println(msg);

}catch(IOException e){

e.printStackTrace();

}finally{

try{

if(socket!=null)socket.close();

}catch(IOException e){e.printStackTrace();}

}

}

}

关于java堵塞模式和java阻塞状态的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。