私はJavaでコンテンツ配信ネットワークを作成しています。私はシステム内の2つのノード間のソケットを管理するLinkクラスを持っています。 RouterNodeとDiscoveryNodeの2つのプログラムがあります。Javaスレッド実行を停止する必要はありません
ルータノードが起動すると、それが最初に行うことは、ディスカバリ・ノードへの接続を初期化しようとしている。
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 =新しいリンク(この、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()を呼び出します。このリスナーは別のスレッドで実行されているため、実際にはスレッドで奇妙なことがあるかどうか、または経験が不足しているかどうかは分かりません。
Iは、ノードクラスが明示的に実行可能な実装していないため、独自のスレッドではありませんされているので、私は別のスレッドで読んでいます私のプログラム内の別のインスタンスが
これが発生する可能性がありますか?
ご協力いただきまして誠にありがとうございます。
編集1:NodeクラスをRunnableを実装して独自のスレッドで開始するようにしましたが、in.read()が呼び出されるとロックされます。
これはまた、スレッドを学びたい場合には、より簡単な方法で機能するプログラムでうまくいくことを望むならば、普通は – barlop
に移動する必要があります。また、完全なファイルも含めるべきです。問題を示すプログラムのバージョン。 – barlop
年齢ではJavaをやっておらず、スレッドはほとんどありませんでしたが、 "in"はスレッドでなければなりませんか? (もしそれが意味をなさないならば)スレッドとして "in"したくないなら、 "in"は続行するために完了しなければならないので、いくつかのprintlnsを使って "in"の位置を調べるべきです。 。)、詰まっている – barlop