java - Java:在需要时生成一个接受套接字的线程?
问题描述
免责声明:我对 Java 还很陌生,所以也许这是一个愚蠢的问题。开始了。
我正在编写一个侦听端口、接受连接、执行其操作并关闭端口的程序。
我希望它在它自己的线程中运行,该线程处理完整的通信。因此,ServerSocket.accept() 将在线程中启动。
但是如果我需要它,我怎样才能只产生一个线程呢?如果我还没有使用 ServerSocket.accept(),我不知道我是否收到了数据,但是如果我在 main 方法中这样做,我将无法在这个打开时接受一个新的。
为了清楚起见,一些示例代码省略了导入:
public class communicator implements Runnable{
private ServerSocket server;
private Socket socket;
Thread t;
communicator(ServerSocket server){
this.server = server;
t = new Thread(this,"MyThread");
t.start();
}
public void run() {
try {
socket = server.accept();
//do stuff
socket.close();
} catch (IOException ex) {
Logger.getLogger(communicator.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
和主要课程:
public class test {
private static ServerSocket server;
private static Socket socket;
public static void main(String[] args) throws IOException{
server = new ServerSocket(123);
communicator comm = new communicator(server);
}
}
或者也许我可以使用类似“如果一个线程处于活动状态,则提供一个新线程”之类的东西?
谢谢。
解决方案
您可以使用类似这样的 Threadpools 和 ExecturonerService。
public class Listener implements Runnable {
private ServerSocket serverSocket;
ExecutorService executorService = Executors.newCachedThreadPool();
public Listener(ServerSocket serverSocket) {
this.serverSocket = serverSocket;
}
@Override
public void run() {
try {
while (true) {
Socket accept = serverSocket.accept();
executorService.execute(new Worker(accept));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
侦听器等待连接到来,创建一个新的 Worker 对象并为其提供执行者服务来运行它。该服务将处理您需要的线程数,并在任务完成后清理所有内容。
public class Worker implements Runnable{
private Socket socket;
public Worker(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
//do stuff
}
}
推荐阅读
- ruby - 即使捆绑程序已成功安装,也无法找到 gemfile
- python - 无法从 beautifulsoup 中获取 p class=info 标签数据
- ajax - 多个ajax请求并行问题
- grails - Grails 3 如何从应用程序根目录访问网站图标、图标和磁贴文件
- excel - Excel 范围选择自动填充(通过给定行的参数
- android - 多个请求完成后的 Android Volley 回调
- enterprise-architecture - 如何将语言日本更改为英语 Enterprise Architect
- dji-sdk - 移动 SDK:ActiveTrack 任务,用于到达混凝土墙的指定点
- ethereum - 使用 Trezor(硬件钱包)将签名交易发送到 Ropsten 或 Truffle 开发网络
- c# - 在远程计算机上的 .net 核心中加载私钥时出错