ある ServerSocket が accept しているとして、その accept から強制的に抜け出させるにはどうすれば良いのでしょうか?
その様なコマンドは存在するのでしょうか?

接続を作るという方法は無しにして・・・・。別のスレッドから中断させる様な・・・・。

A 回答 (2件)

 以下が、サーバを別スレッドで実行させ、それをメインスレッドで監視/制御する方法の一例です。


 このサンプルは、接続中にIEなどで"http://localhost:12354/"にアクセスすれば接続され、
10秒たっても接続がない場合は、強制終了させます。

import java.net.*;

class serverthread extends Thread {

private ServerSocket Server;
private Socket Client;
private boolean ConnectFlag;

public serverthread() throws Exception { super();

Server = new ServerSocket(12345);
ConnectFlag = false;

};

public void ConnectStart() { start(); };

public boolean CheckConnected() { return(ConnectFlag); };

public void BreakConnecting() {

try {Server.close(); } catch(Exception ex) { System.out.println("<close>" + ex.toString()); };

};

public String GetConnectionData() {

if (!ConnectFlag) return("NotConnected");

return(Client.getInetAddress().toString() + " : " + Integer.toString(Client.getPort()));

};

public void run() {

try {

Client = Server.accept();

ConnectFlag = true;

} catch(Exception ex) { System.out.println("<run>" + ex.toString()); };

};

}

public class serverto {

private static final int TimeoutTime = 10;

public static void main(String args[]) {

int Int1;

try {

serverthread ServerThread = new serverthread();
ServerThread.ConnectStart();

for (Int1 = 0; Int1 < TimeoutTime; Int1 ++) {
if (ServerThread.CheckConnected()) break;
System.out.println("Connecting.." + Int1);
try { Thread.sleep(1000); } catch(Exception e) {};
};

if (Int1 == TimeoutTime) ServerThread.BreakConnecting();
System.out.println(ServerThread.GetConnectionData());

ServerThread.join();

} catch(Exception ex) { System.out.println("<main>" + ex.toString()); };

};

}
    • good
    • 0

ServerSocket を close() すれば java.io.InterruptedIOException が


飛んでこないでしょうか?

ServerSocket を、クラスのメンバーにして、そのクラスのスレッドで、
accept() をするスレッドと、中断させるスレッドからは、close() を
するような感じで。

# java は、経験がほとんど無いので自信はあまり無いですが...
    • good
    • 0
この回答へのお礼

ありがとうございます。早速、試してみます。

お礼日時:2001/06/08 00:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Q「UIスレッド」「マルチスレッド」の違い

Androidで、「UIスレッド」「マルチスレッド」の違い、を教えてください。

■下記理解で合ってるでしょうか?
Androidは、「シングルスレッド」の「UIスレッド」モデルなので、それを「マルチスレッド」で動かそうとすると、「ワーカースレッド」で処理する必要がある


・「マルチスレッド」=「マルチタスク」?

・「UIスレッド」とは、メインスレッドが「GUI (グラフィカルユーザーインターフェイス) 処理」を行うものを指す?
・つまり、「Android」=「UIスレッド」?
・「UIスレッド」って何の用語? Androidに特化した用語? それともJAVAの用語? あるいはそれ以外?

Aベストアンサー

違います。

JavaアプリケーションにおけるメインスレッドをAndroidでは「UIスレッド」と呼びます。
Androidはキーのイベント配信等を行うスレッドが1つの「シングルスレッド」モデルです。
重い処理をメインスレッド(=UIスレッド)で行うと、画面の処理が止まったようにみえるため、
重い処理はマルチスレッドを使い、バックグラウンド(=ワーカースレッド)で処理する必要があります。

こんな感じ。

マルチスレッドとマルチタスク(プロセス)は異なり、スレッドとプロセスの違いを調べるといいです。
UIスレッドは、メインスレッドです。
当然、AndroidとUIスレッドは異なります。
UIスレッドがなんの用語かは知りませんが、Androidでは上記のように定義されています。

参考URL:http://www.techdoctranslator.com/resources/articles/articles-index/painless-threading

Qスレッド1とスレッド2を交互に実行するには?

スレッド1→スレッド2→スレッド1・・・と同期を取り合いながら交互にスレッドを動かしたいのですが、Thread.getState()を用いないで実現するよい方法はないでしょうか?
どうしてもデッドロックが発生しうる方法しか思いつかず困っています。
例えば以下のプログラムで1212と交互に表示させたい場合です。
以下のプログラムは当然デッドロックになりますが、やりたいことを伝えるために載せておきます。

Object obj; //スレッド間通信用のobject

class Test1 extends Thread {
 public void run() {
  while(true) {
   System.out.print("1");
   synchronized (obj) {
    obj.notify();//相手をnotifyして
    obj.wait();//自分はwait
   }
  }
 }
}

class Test2 extends Thread {
 public void run() {
  while(true) {
   System.out.print("2");
   synchronized (obj) {
    obj.notify();
    obj.wait();
   }
  }
 }
}
new Test1().start();
new Test2().start();

スレッド1→スレッド2→スレッド1・・・と同期を取り合いながら交互にスレッドを動かしたいのですが、Thread.getState()を用いないで実現するよい方法はないでしょうか?
どうしてもデッドロックが発生しうる方法しか思いつかず困っています。
例えば以下のプログラムで1212と交互に表示させたい場合です。
以下のプログラムは当然デッドロックになりますが、やりたいことを伝えるために載せておきます。

Object obj; //スレッド間通信用のobject

class Test1 extends Thread {
 public void run() {
...続きを読む

Aベストアンサー

スレッド1・2を監視するスレッド3を作って3が1・2を交互に呼ぶ  じゃだめ?

Q複数のスレッドから1つのスレッドの関数を呼び出す場合、順次呼び出したいのですがどうしたらいいですか?

スレッドが8個あったとして

スレッド1、スレッド2、スレッド3から
スレッド5の関数を呼び出したとする。
この場合どうなるか教えてください。

どうなるというのは例として
スレッド1 → getHoge() を呼び出した。
スレッド2 → getHoge() を呼び出した。
スレッド3 → getHogeHoge() を呼び出した。
場合、
スレッド2がgetHoge()を呼び出したときに、
スレッド1が呼び出したgetHoge()が終了していないとすると
1.スレッド1の呼び出したgetHoge()が終了後スレッド2が呼び出した
getHoge()を実行していくのか?
2.スレッド1の呼び出したgetHoge()とスレッド2の呼び出したgetHoge()が並列処理されるのか?

public class TThread extends Thread
{
(関数は質問趣旨とは関係ないので省略して書く)
public int getHoge();

public int getHogeHoge();
}

スレッドが8個あったとして

スレッド1、スレッド2、スレッド3から
スレッド5の関数を呼び出したとする。
この場合どうなるか教えてください。

どうなるというのは例として
スレッド1 → getHoge() を呼び出した。
スレッド2 → getHoge() を呼び出した。
スレッド3 → getHogeHoge() を呼び出した。
場合、
スレッド2がgetHoge()を呼び出したときに、
スレッド1が呼び出したgetHoge()が終了していないとすると
1.スレッド1の呼び出したgetHoge()が終了後スレッド2が呼び出した
getH...続きを読む

Aベストアンサー

まず勘違いしているのは
Threadを継承したクラスのメソッドだからといって
そのメソッドが別スレッドで実行されるわけではないということです。
Thread#run内の処理が別スレッドで起動するだけです。

スレッド1からgetHogeを呼び出せばgetHogeは
スレッド1上で実行され
スレッド2からgetHogeを呼び出せば
スレッド2上で実行されます。

synchronized public int getHoge()
とすれば
getHogeが複数のスレッドから呼び出されても同時に走る事はありません。
(スレッド1とスレッド2が同時に呼び出そうとすれば、どちらかが待機状態になります。)
synchronizedを宣言しなければ
スレッド1とスレッド2からgetHogeが同時に呼ばれる可能性があります。

Qコマンドプロンプトで入力をするためのコマンド

JAVAを勉強中です。
System.out.println()は画面にデータを表示するもの、その逆でJAVAをコマンドプロンプトで走らせたときに一回一回データを入力するためのコマンドがありましたら教えてください。

Aベストアンサー

入力先はJAVAだと思いますのでプロンプトにそのようなコマンドは存在しません。
プロンプトから値をプログラムに入力したい場合は以下のように書けば良いはずです。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.*;
import java.lang.String;
import java.lang.System;

public class TestStream {
public static void main(String[] A00) {
//インスタンス生成
BufferedReader L00 = new BufferedReader(new InputStreamReader(System.in));
try {
System.out.println("文字列を入力してください:");
//入力を代入
String a = L00.readLine();
System.out.println(a);}
} catch(IOException L02) {
System.out.println("入力エラー");
}
}
}

入力先はJAVAだと思いますのでプロンプトにそのようなコマンドは存在しません。
プロンプトから値をプログラムに入力したい場合は以下のように書けば良いはずです。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.*;
import java.lang.String;
import java.lang.System;

public class TestStream {
public static void main(String[] A00) {
//インスタンス生成
BufferedReader L00 = new BufferedReader(ne...続きを読む

Qコマンドプロンプトでキーを押して入力した数値を代入させたいんですが

自分で勉強中の(かなりてこずってる)範囲の課題を出されてしまい困っています。
C言語のscanfのように実行してから数値を代入させてその判別を制御文で行うプログラムを作りたいのですが制御までは授業でやって理解していますが代入させる部分がよくわからないんで教えてください。
ヒントが出されたんですが
BufferdReader br = new BufferdReader(new InputStreamReader(System.in));
String in = br.read.Line();
でできるということでした。
そこで自分なりに考えてみたのが判別するために
(int) in;
とか
int x = (int)in;
とかやってみてinを数値として扱おうとしたのですがエラーが出てしまいました。どこがおかしいのかよくわからなくて調べてみましたが別のファイルからの入力についての解説ページしか見つからなかったのでこちらで分かる方どうか教えてください。

Aベストアンサー

class Q4061261A{

public static void main(String[] args){
java.io.BufferedReader br = new java.io.BufferedReader(new java.io.InputStreamReader(System.in)); //スペルミスあり。
String in = null;
int num = 0;

try{
in = br.readLine(); //read.LineじゃなくreadLine
}catch(java.io.IOException e){
System.out.println(e.toString());
System.exit(0);
}finally{
}


try{
num = Integer.parseInt(in);
}catch(NumberFormatException e){
System.out.println(e.toString());
System.exit(0);
}finally{

}

if (num == 5){
System.out.println("5です。");
}else{
System.out.println("5ではありません");
}
}

}

class Q4061261A{

public static void main(String[] args){
java.io.BufferedReader br = new java.io.BufferedReader(new java.io.InputStreamReader(System.in)); //スペルミスあり。
String in = null;
int num = 0;

try{
in = br.readLine(); //read.LineじゃなくreadLine
}catch(java.io.IOException e){
System.out.println(e.toString());
System.exit(0);
}finally{
}


try{
num = Integer.parseInt(in);
}catch(NumberFormatException e){
System.out.println(e.toString());
Sy...続きを読む


このカテゴリの人気Q&Aランキング

おすすめ情報