멀티 스레딩에 문제가 있습니다. 이유는 모르지만 스레드는 순서대로 실행됩니다. 클라이언트 - 서버 응용 프로그램이 있습니다. 메시지 교환을 위해 여러 개의 병렬 스레드를 실행해야합니다. 전체 수업이 너무 커서 주요 부분을 보여 드리겠습니다. ") (동의"소켓을 사용한 멀티 스레딩 JAVA
public void run(){
flag=true;
System.out.println("Welcome to Server side!");
createLog();
ExecutorService service = Executors.newCachedThreadPool();
ServerSocket servers = null;
int n=4600;
try{
servers = new ServerSocket(n);
} catch(Exception e){
}
Socket fromclient = null;
while(true){
try {
System.out.print("Waiting for a client...");
fromclient = servers.accept();
System.out.println("Client connected.");
Callable<ArrayList<Action>> callable = new HandleThread(fromclient);
Future<ArrayList<Action>> future = service.submit(callable);
list.addAll(future.get());
} catch (Exception e) {
System.out.println("Can't accept.");
System.exit(-1);
}
}
}
가이 코드는 않습니다 후 새로운 생성 : 서버의
public ArrayList<Action> call() {
Thread myThready = new Thread(new Runnable()
{
public void run()
{
BufferedReader in;
PrintWriter out;
try{
Socket fromserver = new Socket(ip, PortID);
in = new BufferedReader(new InputStreamReader(fromserver.getInputStream()));
out = new PrintWriter(fromserver.getOutputStream(),true);
writeLog(query, ID, 0);
out.println(query+"ID"+ID);
String fserver = in.readLine();
writeLog(fserver, ID, 1);
out.println("exit");
out.close();
in.close();
fromserver.close();
}
catch (IOException io){
return;
}
}
});
myThready.start();
}
코드 : 클라이언트의
코드 (이 코드는 내가 버튼을 눌러 때마다 실행) 일부 계산을위한 스레드. HandleThread의
코드 :
public ArrayList<Action> call() {
BufferedReader in = null;
PrintWriter out= null;
try {
in = new BufferedReader(new
InputStreamReader(fromclient.getInputStream()));
out = new PrintWriter(fromclient.getOutputStream(),true);
String input,output;
System.out.println("Wait for messages.");
while ((input = in.readLine()) != null) {
//close filewriter thread if input==exit
if(input.equalsIgnoreCase("exit")){
break;
}
System.out.println(input);
String[] arr = input.split("ID");
System.out.println("+"+arr[0]);
ID = Integer.parseInt(arr[1]);
writeLog(arr[0], ID, 0);
process(arr[0], ID);
out.println(arr[0]);
writeLog(arr[0], ID, 1);
}
out.close();
in.close();
fromclient.close();
} catch(IOException e){
return null;
}
return list;
}
이 작동하지 않는 이유를 모르겠어요. 나는 로그를 가지고 있으며, 하나의 스레드가 다른 스레드 다음에 만 실행되는 것을 볼 수 있습니다. 같은 시간에! 제발, 도와주세요!
이것은 당신이 묻는 버그와는 아무런 관련이 없다. 그러나 적절한 자원 정리를 읽는 것이 좋다. 왜냐하면'HandleThread.call'은 잠재적으로'in'과'out'을 누설 할 수 있기 때문에 pre-java 7. 7에서'close()'호출은 중복됩니다. – Floegipoky
이 'in'과 'out'은 무엇을 의미합니까? – user3051029
당신의'BuffreredReader in'과'PrintWriter out' – Floegipoky