精华内容
下载资源
问答
  • C# UdpClient 结束Receive()方法的阻塞

    千次阅读 2018-12-04 22:37:02
    关闭窗体时,怎样结束Receive方法的阻塞? 答案是自己给自己发一个消息,随便什么内容。 Console.WriteLine("等待连接..."); byte[] bytes = listener.Receive(ref RemoteIpEndPoint); UdpClient udp...

    关闭窗体时,怎样结束Receive方法的阻塞?

    答案是自己给自己发一个消息,随便什么内容。

    Console.WriteLine("等待连接...");
    byte[] bytes = listener.Receive(ref RemoteIpEndPoint);
    UdpClient udpClient = new UdpClient(4444);
    udpClient.Connect("127.0.0.1", 8888);
    string msg = "1";
    Byte[] bytes = Encoding.ASCII.GetBytes(msg);
    udpClient.Send(bytes, bytes.Length);

     

    展开全文
  • LinkedBlockingDeque自动阻塞的双端队列。 增删元素的方法都是用ReentrantLock上锁。 add方法无返回值,满了报异常,offer方法满了return false,put方法满了await自动阻塞。 以putFirst(E e)为例: final ...

    LinkedBlockingDeque自动阻塞的双端队列。
    增删元素的方法都是用ReentrantLock上锁的。
    add方法无返回值,满了报异常,offer方法满了return false,put方法满了await自动阻塞。

    以putFirst(E e)为例:

    final ReentrantLock lock = new ReentrantLock();
    private final Condition notFull = lock.newCondition();
    public void putFirst(E e) throws InterruptedException {
            if (e == null) throw new NullPointerException();
            Node<E> node = new Node<E>(e);
            final ReentrantLock lock = this.lock;
            lock.lock();
            try {
                while (!linkFirst(node))//returns false if full.
                    notFull.await(); //实现list满了的情况下就会自动阻塞
            } finally {
                lock.unlock();
            }
        }
    

    以pollFirst()为例,peek,get等方法均不阻塞

    public E pollFirst() {
            final ReentrantLock lock = this.lock;
            lock.lock();
            try {
                return unlinkFirst();
            } finally {
                lock.unlock();
            }
        }
    

    只有take方法是自动阻塞的,调用condition的await方法进行阻塞

    public E takeFirst() throws InterruptedException {
            final ReentrantLock lock = this.lock;
            lock.lock();
            try {
                E x;
                while ( (x = unlinkFirst()) == null)
                    notEmpty.await();
                return x;
            } finally {
                lock.unlock();
            }
        }
    
    展开全文
  • 刚刚看关于文件上传课程,记录自己对于read方法阻塞的理解。如有问题,希望大家指正。 read方法调用后,会阻塞(程序暂停在read方法使用处)。 阻塞后,read方法有多种情况会解除阻塞: 1.检测到有输入数据可用。...

    刚刚看关于文件上传的课程,记录自己对于read方法阻塞的理解。如有问题,希望大家指正。

    read方法调用后,会阻塞(程序暂停在read方法使用处)。
    阻塞后,read方法有多种情况会解除阻塞:

    情况如下:

      1.检测到有输入数据可用。
    	一般在使用中,OutputStream.write(),InputStream.read()一一对应,
    	不会出现阻塞
      2.接收到结束标记
    	A.调用socket类的方法//void shutdownOutput() 禁用此套接字的输出流。  
    	  可以在输出流后加上结束标记,使得输入流使用read()函数不会阻塞。
    	B.FileInoutStresm的read() 在输入文件时,文件末尾自带结束标记。
      3.发送的对象被释放(不会报错)
    	输出流被释放,输入流的read()会返回-1 ,不会阻塞
      4.与发送方断开连接(会报错)
    	譬如:服务器被关闭,客户端的read()会因报错而停止
    

    贴一下我遇到阻塞的代码及阻塞原因
    原因:while会一直调用read,read在收不到数据后就会阻塞,不会返回-1

    //IPS 是InputStream 对象
    while( (len= IPS.read(bytes))!=-1) {
    		//7.fos是FileOutputStream对象  将接收的数据导入硬盘
    			fos.write(bytes,0,len);
    		}
    

    下面是对程序的分析

    整个程序中上述阻塞代码相同形式有三处。客户端有两处,服务器一处。
    三处只有服务器的那一部分会产生阻塞。
    客户端第一处:是对文件的输入,文件读取完会返回-1.
    客户端第二处:服务器程序的资源释放后,read()返回-1
    服务器处:在客户端程序输出完文件数据后,加上shutdownOutput() ,
             人为加上结束标记,解决问题。
    

    服务器程序main函数

    public class FileUoloadServer {
    
    	public static void main(String[] args) throws IOException {
    		// TODO Auto-generated method stub
    		//1.创建一个服务器serversocket对象,和系统指定的端口号
    		ServerSocket sever = new ServerSocket(7777);
    		//2.使用serversocket对象中的accept方法,获取获取客户端请求的socket
    		Socket socket = sever.accept();
    		//3.使用socket对象中的方法getInputStream() 获取网路字节输入流InputStream对象
       		InputStream IPS = socket.getInputStream();
    		//4.判断文件夹是否存在,不存在就创建
       		File file = new File("d:\\upload");
       		if(!file.exists()) {
       			file.mkdir();
       		}
       		//5.使用本地字节输出流fileoutputstream对象,构造方法绑定输出路径
    		FileOutputStream fos = new FileOutputStream(file+File.separator+"fileUpload.JPG");
       		//6.使用网络字节输入流InputStream对象中的方法read,读取客户端上传的文件
    		int len =0;
    		byte[] bytes = new byte[1024];
    		while( (len= IPS.read(bytes))!=-1) {
    		//7.使用本地字节输出流fileoutputstream对象中的write方法,把读取的文件保存到服务器硬盘上
    			fos.write(bytes,0,len);
    		}
    		//8.使用socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象
    		//9.使用网络字节输出流OutputStream对象中的的方法write,给客户端发送数据。
    		OutputStream OPS = socket.getOutputStream();
    		OPS.write("上传成功".getBytes());
    		//10.释放资源(serversocket/socket/fileoutputstram)
    		sever.close();
    		socket.close();
    		fos.close();
    	}
    
    }
    
    

    客户端main函数

    public class FileUploadClient {
    
    	public static void main(String[] args) throws IOException {
    		// TODO Auto-generated method stub
    		//1.创建一个本地字节输入流fileinputstream对象,构造方法绑定文件
    		FileInputStream fis = new FileInputStream("E:\\fileUoload.JPG");
    		//2.创建一个客户端socket对象,构造方法绑定服务器的ip和端口
    		Socket soc = new Socket("127.0.0.1",7777);
    	 	//3.使用socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象
    		OutputStream OPS = soc.getOutputStream();
    		//4.使用本地字节流fileinputstream对象中的read,读取本地文件
    		int len = 0;
    		byte[] bytes = new byte[1024];
    		while( (len= fis.read(bytes))!=-1)
    		{
    			//5.使用网络字节输出流OutputStream对象中的的方法write,把读取的文件上传给服务器。
    			OPS.write(bytes,0,len);
    			
    		}
    		//void shutdownOutput() 禁用此套接字的输出流。  
    		soc.shutdownOutput();
    		//6.使用socket对象中的方法getInputStream() 获取网路字节输入流InputStream对象
    		InputStream IPS = soc.getInputStream();
    		while( (len= IPS.read(bytes))!=-1)
    		{
    			//7.使用网络字节输入流InputStream对象中的方法read,读取服务器回写的数据
    			System.out.println(new String(bytes,0,len));
    		}
    		//8.释放socket fileinputstream
    		fis.close();
    		soc.close();
    	}
    
    }
    
    
    展开全文
  • 近期打算研究下基于NIONetty框架,先来回顾一下I/O基础。   JAVA里IO 目前有两种,一种是早期发布I/O...第一:在调用InutStream.read 方法阻塞的,它会一直等到数据到来时(或超时)才会返回;第二:...

    近期打算研究下基于NIO的Netty框架,先来回顾一下I/O的基础。

     

    JAVA里的IO 目前有两种,一种是早期发布的I/O模型,也就是所谓的BIO(Blocking I/O);另一种是JDK1.4里发布的基于 多路复用实现的NIO。

     

    阻塞型 I/O,主要阻塞在两个地方:

    第一:在调用InutStream.read 方法是阻塞的,它会一直等到数据到来时(或超时)才会返回;第二:在调用ServerSocket.accept()方法时,也会一直阻塞到有客户端连接才会返回;

    目前大部分的客户端服务端的网络应用软件的早期版本的I/O都是使用阻塞型的I/O实现。处理模型参考:

    阻塞型的I/O 存在以下几点问题:

    首先,InputStream.read()方法在其缓存区未满时,会造成阻塞,只有一定的数据填满了缓存区或者客户端关闭了套接字,方法才会返回。
    其次,会产生大量的垃圾,BufferedReader创建了缓存区来从套接字中读入数据,但是同样创建了一些字符串存储这些数据。这些String很快变成垃圾需要回收。
    类似的,读写操作被阻塞而且向流中一次写入一个字符会造成效率低下,所以应该使用缓存区,但一旦使用缓存,流又会产生更多是垃圾。
    另外,通常在JAVA中处理阻塞I/O要用到线程(大量的线程),一般是实现一个线程池来处理请求。线程使得服务器可以处理多个连接,但是他们同样也引发了许多问题。每个线程拥有
    自己的栈空间并且占用一些CPU时间,耗费很大,而且很多时间是浪费了阻塞I/O操作上,没有有效利用CPU.
     

    下面,来看一下阻塞I/O的具体的阻塞情况点:

    首先来看一下JAVA文档中的 InputStream 的签名

    public abstract class InputStream extends Object implements Closeable

    此抽象类是表示字节输入流的所有类的超类。

    需要定义 InputStream 的子类的应用程序必须始终提供返回下一个输入字节的方法。

     

    个人理解,这种对象的概念有点像需要数据传输双方之间的一个通道,这个通道负责接收数据(与之对应还有OutPutStream 负责发送数据)。

     

    到目前为止,我所接触到的I/O主要是 File I/O 和 Socket I/O。

     

    InputStream 中的read方法用于读取数据,方法有3个重载。

    abstract  int read()
              从输入流读取下一个数据字节。
     int read(byte[] b)
              从输入流中读取一定数量的字节并将其存储在缓冲区数组 b 中。
     int read(byte[] b, int off, int len)
              将输入流中最多 len 个数据字节读入字节数组。

     

    其中InputStream.read()方法,这个方法是从流里每次只读取读取一个字节,效率会非常低。    

    更好的方法是用InputStream.read(byte[] b)或者InputStream.read(byte[] b,int off,int len)方法,一次读取多个字节。

    这里有一点需要特别注意:read 方法在输入数据可用、检测到文件末尾或者抛出异常前,此方法一直阻塞。

    这是什么意思呢?

    我们来看一个简单的Socket通信的例子:

     

     【Client】                                                                【ServerSocket】

                                                                                       1、accept()

                                                                                       服务端阻塞,至接收到客户端的请求

     

       2、new Socket("address",port);                                          

       建立一个和服务端的socket连接                               接收到客户端连接,accept 阻塞结束

     

                                                                                       3、socket.getInputStream().read();

                                                                                       从socket请求获取输入流,读取流中的数据。

                                                                                       这个时候问题来了:虽然和客户端的连接好了

                                                                                       但是服务端不知道客户端什么时候会发来数据,

                                                                                       另外,因为网络传输的原因,数据还可能被分

                                                                                       多次到达。结合上面的说明:也就好理解了。

                                                                                       read需要等待输入和输入的到达。

    ---------------------------------------------------------------------------------------------------------------------------

    Socket流这里还存在另外一个问题,socket流和文件流不太一样,文件流很容易知道文件末尾,到了文件末尾,直接就把流close掉就OK了。但是socket 流不一样,你无法知道它什么时候到末尾,所以连接一直保持着,流也一直保持阻塞状态。即使用了带参数的read方法,返回了有效数据,但其实流仍然没有关闭,处于阻塞状态。
    针对这种请情况,一般就需要通信的双方约定数据传输的协议了。比如,约定消息的头部首先明确此次传输数据的大小。这样服务端就可以有目的性的读取数据。

     

    ---------------------------------------------------------------------------------------------------------------------------

    总结一下:

    首先,Socket I/O时,发送方如果不将输出流进行关闭,接收方就会认为输入流没有结束,直到超时.
    其次,我们判断一个信息是否已经完全的读取完毕,除了使用输入流结束这种办法,还可以自行封装一层协议,用于信息的交互.

     

    这里其实是可以借鉴TCP长连接的实现的:Java当中的Socket类,其实是使用TCP协议进行传输的.

    一般情况下,我们会在TCP的基础上再封装一层协议,用户长连接的传输.协议的信息包,也分包头和包体两个部分.
    包体,主要就是我们要传输的信息.(维持连接的信息包,包体可为空)
    包头,一般分为三个部分.第一部分是信息包的长度(长度一般是指整个信息包的长度);第二部分是包体信息的类型(在这里指出是否是维持连接包);第三部分是信息包的序列号,一般情况下,这个序列号要确保在传输过程中唯一标识该信息包.
    如果为了安全起见,还可以在包体后添加包尾,包尾数据用于对包体数据的验证)
    这样,通信双方就可以根据包长来判断一次接收的操作是否结束了.                                                                               

      

      

     

     

     

    展开全文
  • python 中,队列是线程间最常用交换数据形式。Queue模块是提供队列操作模块,虽然简单易用...1. 阻塞模式导致数据污染 import Queue  q = Queue.Queue(10)  for i in range(10):  myData = 'A'  q.p...
  • 用java,搞通信一定会接触到Socket,ServerSocket这2个类,基本使用非常简单,但如果想良好控制,还是得小心之非常啊.因为Socket中InputStreamread()当管道无数据时便等待数据填充,但OutputStream可以继续写入数据....
  • 在调用alert()方法后,因为JS的阻塞特性,alert()后面的js代码不会执行, 我用一个DVI模拟alert弹出框,但是怎么阻塞后面代码执行呢? 求高手指教。
  • 解决阻塞队列BlockingQueue的drainTo方法的阻塞问题   解决方法: take方法是逐一获取队列中的元素,为空就阻塞,而drainTo是批量获取,为空不阻塞。下面实现drainTo也阻塞功能:...
  • Selector select方法阻塞register解决方法
  • BufferedReaderreadLine方法阻塞的处理

    万次阅读 热门讨论 2016-06-15 10:46:23
    BufferReaderread方法和readLine方法在任何情况下都是阻塞的。readLine方法每次读一行,相对于一个字符/字节地读取、转换、返回来说,它有一个缓冲区,读满缓冲区才返回;一般情况下,都建议使用它们把其它Reader/...
  • 下面几个例子说明阻塞的方法,一共四种方式执行Callable线程列表 使用线程池submit方法但不调用get方法(不可行) 线程池依次submit线程并依次调用get方法(不可行) 线程池submit十个线程,并将返回future加入...
  • 因为read()方法阻塞的,如果硬件一直没有数据发过来话,read()方法会一直阻塞,这个方法我单独放在了一个子线程当中。 但是业务要求在退出时候要释放所有资源,方便第二次启动程序重新连接硬件。但是我在主线程...
  • QT中一般都推荐使用异步方式,因为信号与槽是QT核心。但是,有些时候我们需要等待一个返回结果之后,才能执行下一步操作。当然,我们可以在返回槽...所以本文介绍一种,将异步非阻塞请求转为同步阻塞请求的方法
  • linux socket的阻塞和非阻塞设置方法

    万次阅读 2017-07-26 15:00:22
    非阻塞IO 和阻塞IO: 在网络编程中对于一个网络句柄会遇到阻塞IO 和非阻塞IO 的概念, 这里对于这两种socket 先做一下说明: 基本概念: 阻塞IO:: socket 的阻塞模式意味着必须要做完IO 操作(包括错误)才会 ...
  • 阻塞方法与中断方法

    千次阅读 2016-04-12 11:48:25
    1.线程可能在执行过程中阻塞或者暂停执行,例如等待IO结束,等待获得一个锁,等待从Thread.sleep方法中醒来,或者等待另一个线程计算结果。2.阻塞方法:BlockingQueueput和take方法会抛出收检查异常:...
  • 查找阻塞与被阻塞的方法主要有下面几种: 一.通过查找v$lock和v$locked_object 这是最常用也是最直接的方法 SQL> select sid,block from v$lock where block=1; SID BLOCK ---------- ---------- 252 1   ...
  • 使用CompletionService解决Futureget方法阻塞问题 解决方法: CompletionService take()方法获取最先执行完线程Future对象。 详情:http://www.ya​yihouse.com/yayishuwu/chapter/1546...
  • Java中实现线程阻塞的方法

    千次阅读 2020-06-23 17:56:51
    Java中实现线程阻塞的方法线程睡眠:Thread.sleep (long millis)线程等待:Object类中wait()方法线程礼让,Thread.yield() 方法线程自闭,join()方法 线程睡眠:Thread.sleep (long millis) 使线程转到阻塞状态。...
  • 1) offer(anObject):表示如果可能的话,将anObject加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则返回false.(本方法不阻塞当前执行方法的线程) 2) offer(E o, long timeout, TimeUnit unit),...
  • 无论是无缓冲通道,还是有缓冲通道,都存在阻塞的情况,但其实有些情况,我们并不想读数据或者写数据阻塞在那里,有1个唯一解决办法,那就是使用select结构。 这篇文章会介绍,哪些情况会存在阻塞,以及如何使用...
  • 实现非阻塞 connect ,首先把 sockfd 设置成非阻塞的。这样调用 connect 可以立刻返回,根据返回值和 errno 处理三种情况: (1) 如果返回 0,表示 connect 成功。 (2) 如果返回值小于 0, errno 为 EINPROGRESS, ...
  • 线程阻塞或暂停执行原因:等待I/O结束、等待获得一个锁、等待从Thread.sleep方法中醒来、等待另一个线程计算结果。 当线程阻塞时,它通常被挂起,并处于某种阻塞状态(BLOCKED,WAITING,TIMED_WAITING)。 阻塞...
  • 问题描述 最近刚刚上线服务突然抛出大量TimeoutException,查询后发现是使用了CompletableFuture,并且在执行future.get(5, ...首先我们知道CompletableFutureget()方法值会阻塞主线程,直到子线程执行任务...
  • 使线程进入阻塞状态的方法

    千次阅读 2019-10-21 22:58:15
    sleep( ) 使线程在一定时间内进入阻塞状态,不能得到cpu时间,但不会释放锁资源。指定时间一过,线程重新进入可执行状态 wait( )使线程进入阻塞状态,同时释放自己占有锁资源,和notify( )搭配使用 ...
  • 线程阻塞方法

    千次阅读 2018-03-29 13:55:54
    sleep方法:顺序进入同步块,不释放锁,持有monitor对象锁,其他线程是不能进入。//忍让一段时间wait方法:当调用wait方法后,当前线程会释放持有monitor对象锁,因此,其他线程还可以进入到同步方法,线程被...
  • ssh登录阻塞在pledge: network解决方法一 前言二 解决方法三 关于systemd-logind 一 前言 ssh 登录服务器是发生阻塞,大约会15-60秒才能登录成功。 使用 ssh -v debug方式登录。可以查看登录过程是在哪一个环节...
  • 在Golang中各种永远阻塞的姿势 Go运行时当前设计,假定程序员自己负责检测何时终止一个goroutine以及何时终止该程序。 可以通过调用os.Exit或从main()函数返回来以正常方式终止程序。而有时候我们需要是使...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,035
精华内容 10,414
关键字:

方法的阻塞