java 阻塞式socket+多任务处理

问题描述

小菜最近碰到一个问题,采用多线程socket通信模式,有多个客户机可能发送处理请求。server端的serversocket每接受一个任务请求,就往任务队列添加一个任务,然后返回任务状态给客户端。这时候有另外一个任务处理线程,只要任务队列不为空就取一个出来处理。整个流程就是这样,应该采用什么方式来设计。我把任务处理线程也设计成阻塞式线程了,结果就是只有一个线程能执行。。

解决方案

解决方案二:
应该用生产者消费者模式来设计吧,具体实现几句话说不清楚,楼主自己摸索吧,任务处理线程这地方有点问题,任务处理线程是阻塞的没问题,因为不过它应该是用来调度的而不是由他来处理,就是只要任务队列不为空就取一个出来处理。这里不是取出来就处理,这样当然就编程单线程了,应该是只要任务队列不为空就取一个出来然后开一个处理线程进行处理。你的任务线程是阻塞的,但是处理线程是多线程就可以了。
解决方案三:
看你客户socket的数量了,同步方式理解和代码写起来要简单,但是占用大量的系统资源,客户不多的时候可以用同步方式,如果客户达到几千上万的用NIO的异步方式。
解决方案四:
哈哈,对于两个阻塞式线程,只能用sleep让两个线程同时工作了。你说的NIO一部方式还不是很了解,有时间好好了解下
解决方案五:
首先说一下,楼主前面的设计是没有问题的,但是任务处理线程处理完一个任务,要把这个任务从任务队列里清楚,然后下一次再从队列里取出第一个任务继续处理,这样没有问题。然后可以提一个建议,楼主可以楼主可以多创建几个处理任务的线程,同时处理任务,这样就设计线程同步问题的处理,楼主需要使用线程锁来解决线程同步问题,相关问题,可以到网上搜一下,这方面的例子有很多。
解决方案六:
引用楼主fnststart的回复:

我把任务处理线程也设计成阻塞式线程了,结果就是只有一个线程能执行。

总体思路没啥问题。楼主会用线程池么?起步:监听专门用一个线程,也可以理解为分发线程;监听到新的连接请求后,就将这个Socket作为一个任务扔给线程池。进阶:同时注意线程池的任务数量是否太多,如果太多了要不要适量增加线程池的线程数;如果更多的情况下,是否要拒绝连接请求以保证服务器端压力不要太大;还有是否要注意闲置连接(连接建立后啥事不干);还有是否要注意长时间忙碌连接(可能死循环了之类的)。

时间: 2024-11-02 05:25:57

java 阻塞式socket+多任务处理的相关文章

关于java阻塞socket和非阻塞socket的应用区别

问题描述 关于java阻塞socket和非阻塞socket的应用区别 最近在学习NIO,在学习非阻塞Socket的时候 很困惑,不知道他相对于阻塞的Socket的优势 在哪,希望大神指点一二,在线等. 解决方案 阻塞就是一直等待结果返回,非阻塞就是立即返回,等有了结果了以后,再回调,事件通知你 解决方案二: 传统的阻塞式,每个连接必须要开一个线程来处理,并且没处理完线程不能退出. 非阻塞式,由于基于反应器模式,用于事件多路分离和分派的体系结构模式,所以可以利用线程池来处理.事件来了就处理,处理完

《Java NIO文档》非阻塞式服务器

即使你知道Java NIO 非阻塞的工作特性(如Selector,Channel,Buffer等组件),但是想要设计一个非阻塞的服务器仍然是一件很困难的事.非阻塞式服务器相较于阻塞式来说要多上许多挑战.本文将会讨论非阻塞式服务器的主要几个难题,并针对这些难题给出一些可能的解决方案. 查找关于非阻塞式服务器设计方面的资料实在不太容易,所以本文提供的解决方案都是基于本人工作和想法上的.如果各位有其他的替代方案或者更好的想法,我会很乐意听取这些方案和想法!你可以在文章下方留下你的评论,或者发邮件给我(

Java多线程程序非阻塞式锁定实现

Java对多线程程序的锁定已经有良好的支持,通常使用synchronized修饰一个方法或者一段代码.但是有一个问题,多个线程同时调用同一个方法的时候,所有线程都被排队处理了.该被调用的方法越耗时,线程越多的时候,等待的线程等待的时间也就越长,甚至于几分钟或者几十分钟.对于Web等对反应时间要求很高的系统来说,这是不可以接受的.本文就介绍一种自己实现的锁定方法,可以在没有拿到锁之后马上返回,告诉客户稍候重试. 某一段程序同一时刻需要保证只能单线程调用,那么策略很简单,最先到的线程获取锁成功,在它

使用阻塞式队列处理大数据

前言 我们都知道,JAVA对于文本文件在读时是独占的,即使可以用多线程去读也涉及到一个POS(定位读)的问题,这在设计框架上会带来许多的复杂性,同时也带来代码上的不可维护性以及会经常出一些千奇百怪的错误(多线程程序由其如此). 传统阻塞式做法的敝病 特点:多线程,阻塞式导入 缺点:阻塞式,导入速度慢,线程状态无法精确记录,速度慢内存开销大 优秀的做法 多线程 非阻塞式 内存开销恒定 线程可以自由增加 我们将采用的做法 在数据提取的设计时基于以下几个指标考虑: 1)内存占用数始终必须恒定值 2)使

读懂Java中的Socket编程(转)

Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的Socket编程,并且如何写一个客户端/服务器程序.  餐前甜点  Unix的输入输出(IO)系统遵循Open-Read-Write-Close这样的操作范本.当一个用户进程进行IO操作之前,它需要调用Open来指定并获取待操作文件或设备读取或写入的权限.一旦IO操作对象被打开,那么这个用户进程可以对

教你轻松读懂Java中的Socket编程

餐前甜点 Unix的输入输出(IO)系统遵循Open-Read-Write-Close这样的操作范本.当一个用户进程进行IO操作之前,它需要调用Open来指定并获取待操作文件或设备读取或写入的权限.一旦IO操作对象被打开,那么这个用户进程可以对这个对象进行一次或多次的读取或写入操作.Read操作用来从IO操作对象读取数据,并将数据传递给用户进程.Write操作用来将用户进程中的数据传递(写入)到IO操作对象. 当所有的Read和Write操作结束之后,用户进程需要调用Close来通知系统其完成对

c++ 编程问题-c++与java通信(socket TCP)c++用的默认的编码,java用的UTF-8 怎么解决中文乱码问题

问题描述 c++与java通信(socket TCP)c++用的默认的编码,java用的UTF-8 怎么解决中文乱码问题 c++代码如下,谁可以试着尝试一下,谢谢 #include #include #include #pragma comment(lib,"ws2_32.lib") void main() { //创建套接字 WORD myVersionRequest; WSADATA wsaData; myVersionRequest=MAKEWORD(1,1); int err;

【Java TCP/IP Socket】TCP Socket通信中由read返回值造成的的死锁问题(含代码)(转)

书上示例 在第一章<基本套接字>中,作者给出了一个TCP Socket通信的例子--反馈服务器,即服务器端直接把从客户端接收到的数据原原本本地反馈回去. 书上客户端代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 import java.net.Socket; import java.net.Sock

Java的一个Socket实例在TCP通信中只能单工?!!

问题描述 RT我做的是Android客户端(好吧,我还是想在JavaSE板块来问,因为问题出在Java的Socket上)与C#编写的服务器端进行数据交互单独测试Android发送.C#接收,或者,C#发送.Android接收,都没问题现在我想这么做:(1)Android发送一组数据,由C#来接收(2)C#处理之后,发送一组数据返回给Android(3)Android接收之后,显示给用户现在(1),(2)都正常,问题出在(3)我的Android端的流程是这样的:<1>获得socket实例的Out