Java线程在不应该执行的地方停止执行';不可能
我正在用java编写一个内容分发网络。我有一个Link类来管理系统中两个节点之间的套接字。有两个程序,RouterNode和DiscoveryNode 当路由器节点启动时,它要做的第一件事是尝试初始化与发现节点的连接:Java线程在不应该执行的地方停止执行';不可能,java,blocking,multithreading,Java,Blocking,Multithreading,我正在用java编写一个内容分发网络。我有一个Link类来管理系统中两个节点之间的套接字。有两个程序,RouterNode和DiscoveryNode 当路由器节点启动时,它要做的第一件事是尝试初始化与发现节点的连接: public RouterNode(int num) { myNumber = num; input = new Scanner(System.in); try { discoveryServer = new Socket("MONDAY
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块
link类的构造函数(在“myServerLink=newlink(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);
我的问题是,一旦我从路由器节点实例化了链接,它的执行就会从它调用.read()时阻塞它的LinkListenerThread停止。这个监听器是在一个单独的线程上运行的,所以我不确定这是否是线程中的奇怪现象,或者这只是我缺乏使用线程经验的一个例子
我的程序中还有一个实例,我在一个单独的线程上阅读
这可能是因为节点类没有显式实现runnable,因此不在它们自己的线程上
非常感谢您的帮助
编辑1:我已经让节点类实现Runnable并在它们自己的线程上启动它们,但是当调用in.read()时它仍然会锁定 使用.start()而不是.run()解决了该问题
这一切归结为对如何在java中实例化线程的误解。使用.start()而不是.run()解决了这个问题
这一切归结为对如何在java中实例化线程的误解。您打算通过调用
thread.run()
方法而不是thread.start()
来启动线程。这使程序成为单线程,如果没有数据进入,或者while循环永远不会结束,那么I/O操作将阻塞try-catch子句中的唯一线程(主线程)
只需使用Thread.start()启动线程即可解决问题。您打算通过调用
Thread.run()
方法而不是Thread.start()
来启动线程。这使程序成为单线程,如果没有数据进入,或者while循环永远不会结束,那么I/O操作将阻塞try-catch子句中的唯一线程(主线程)
只需使用Thread.start()启动线程就可以解决问题。这也应该移到StackOverflow,通常如果您想学习线程,最好使用一个功能更简单的程序。。您可能还应该包括完整的文件。。所以你甚至可以找到你的程序的简单版本来证明这个问题。很久没有做过java,也几乎没有做过线程,但也许“in”必须是一个线程?(如果这有意义的话)如果你不想把“in”作为一个线程,那么“in”必须完成才能继续,所以你应该做一些println来找出“in”-in.read(..)在哪里得到了stuckI,我也和一些朋友谈过,结果证明这是因为我对java线程缺乏经验。我用.start()而不是.run()开始执行线程,这个问题基本上得到了解决,很抱歉我的问题放错了地方:我甚至没有注意我在哪里发布了这个。这个问题也应该移到StackOverflow,通常如果你想学习线程,最好使用一个功能更简单的程序。。您可能还应该包括完整的文件。。所以你甚至可以找到你的程序的简单版本来证明这个问题。很久没有做过java,也几乎没有做过线程,但也许“in”必须是一个线程?(如果这有意义的话)如果你不想把“in”作为一个线程,那么“in”必须完成才能继续,所以你应该做一些println来找出“in”-in.read(..)在哪里得到了stuckI,我也和一些朋友谈过,结果证明这是因为我对java线程缺乏经验。我用.start()而不是.run()开始执行线程,这个问题基本上得到了解决。很抱歉,我的问题放错了地方:我甚至没有注意我在哪里发布了这个。