pin*_*ing 3 java multithreading
我之前发布了一个关于Java线程的查询.(链接文字)
根据我收到的答案,我决定实施它们.所以我在具有2个CPU内核的机器上完成了这一点编码.代码如下
import java.net.*;
import java.io.*;
public class thready implements Runnable{
private Socket num;
public thready(Socket a) {
this.num=a;
}
public void run() {
try {
BufferedInputStream is = new BufferedInputStream(num.getInputStream());
System.out.println("Connected to port"+num);
} catch (IOException ex) {
//Logger.getLogger(thready.class.getName()).log(Level.SEVERE, null, ex);
}
}
public static void main(String [] args)
{
int port = 80;
int port1= 81;
//int count = 0;
try{
ServerSocket socket1 = new ServerSocket(port);
ServerSocket socket2 = new ServerSocket(port1);
while (true) {
Socket connection = socket1.accept();
Socket connection1 = socket2.accept();
Runnable runnable =new thready(connection);
Runnable run= new thready(connection1);
Thread t1=new Thread(runnable);
Thread t2=new Thread(run);
t1.start();
t2.start();
}
}
catch(Exception e)
{
} }}
Run Code Online (Sandbox Code Playgroud)
现在我使用Hyperterminal测试这段代码,并连接到端口890和端口81(我正在使用2个超级终端实例),据我所知,预期的行为应该是"连接到端口'端口号'"应该是一旦连接到任何端口(80或81),就会打印出来.但是我从这段代码得到的输出是,如果我只连接到1个端口,那么所需的输出不会被打印,如果我连接到两个端口,一个接一个,输出只在两个端口之后打印连接了.因此,这再次引发了我最初的困惑,即这两个线程是同时执行还是执行在这两个线程之间交替进行.
任何建议都会有很大帮助.
干杯
你accept在开始线程之前打电话.accept将阻止,直到建立连接,这就是为什么你看到你做的行为.如果要监听多个端口,则需要[1]为每个端口创建一个线程ServerSocket,然后在accept返回时启动通信线程,或者在执行侦听的线程中逐个处理连接.
[1]这仅适用于您ServerSocket直接使用的情况,您可能应该在学习时使用它.的java.nio包及其子包包含类用于与多路复用非阻塞I /可用于O,例如使用,监听在同一线程中的多个插座.
在开始你的线程并阻止它们之前,你正在进行大量的初始化.
我会将所有代码移动到runnable中.然后你也可以避免这些重复的变量名称,如connection和connection1,让Thready拥有这些对象.
| 归档时间: |
|
| 查看次数: |
287 次 |
| 最近记录: |