我正在用java编写内容分发网络。我有一个Link类来管理系统中两个节点之间的套接字。有两个程序,RouterNode和DiscoveryNode。
当路由器节点启动时,它首先要做的是尝试初始化与发现节点的连接:
public RouterNode(int num)
{
myNumber = num;
input = new Scanner(System.in);
try {
discoveryServer = new Socket("MONDAY-PC", 60111);
myServerLink = new Link(this, discoveryServer);
} catch (IOException e) {
System.out.println("Socket could not be opened. Node terminating.");
System.exit(-1);
}
构造函数还有更多,但我的问题使我的程序无法通过此try块。
链接类的构造函数(在'myServerLink = new Link(this,discoveryServer);'上调用)看起来像这样:
public Link(Node n, Socket s)
{
parentNode = n;
regSocket = s;
try {
out = new DataOutputStream(regSocket.getOutputStream());
in = new DataInputStream(regSocket.getInputStream());
} catch (IOException e) {
System.out.println("Data Streams could not be created on the link.");
e.printStackTrace();
}
new Thread(new LinkListenerThread(this, in)).run();
}
此构造函数的最后一行启动一个新线程,该线程旨在侦听正在传递的传入消息的套接字。
LinkListenerThread中的run()方法如下:
@Override
public void run()
{
byte[] message;
System.out.println("Link now active and running.");
while(!done)
{
System.out.println("attempting to read from socket...");
try {
// read now many bytes the following message will be
byte[] messageLengthBytes = new byte[4];
in.read(messageLengthBytes, 0, 4);
我的问题是,一旦我从路由器节点实例化链接,它的执行将从看起来像LinkListenerThread阻止它调用in.read()时停止。这个监听器是在一个单独的线程上运行的,所以我不确定这对于线程来说实际上是不是很奇怪,或者它只是我缺乏经验的一个例子。
我的程序中有另一个实例,我在另一个线程上阅读
这是否可能是因为节点类没有显式实现runnable,因此它们不在自己的线程上?
非常感谢任何帮助。
编辑1:我已经让Node类实现了Runnable并在他们自己的线程上启动它们,但是当调用in.read()时它仍然会锁定;
答案 0 :(得分:0)
使用.start()代替.run()
解决了问题这一切都归结为对如何在java中实例化线程的误解。
答案 1 :(得分:0)
您打算通过调用Thread.run()
方法而不是Thread.start()
来启动一个帖子。这使得你的程序是单线程的,那么如果没有数据进入或者while循环永远不会结束,那么I / O操作就会阻塞try-catch子句中唯一的线程(主线程)。
只需使用Thread.start()启动一个线程就可以解决你的问题。