2010-01-22 5 views
3

J'avais précédemment posté une requête sur les threads Java. (link text)Les threads Java doutent

Et sur la base des réponses que j'ai reçues, j'ai décidé de les implémenter. J'ai donc fait ce peu de codage sur une machine avec 2 cœurs de processeur. Le code est le suivant

import java.net.*; 
import java.io.*; 


public class thready implements Runnable{ 
private Socket num; 

public thready(Socket a) { 
    this.num=a; 
} 
public void run() { 
    try { 
     BufferedInputStream is = new BufferedInputStream(num.getInputStream()); 
     System.out.println("Connected to port"+num); 
    } catch (IOException ex) { 
     //Logger.getLogger(thready.class.getName()).log(Level.SEVERE, null, ex); 
    } 


} 
public static void main(String [] args) 
{ 
    int port = 80; 
    int port1= 81; 
    //int count = 0; 
    try{ 

    ServerSocket socket1 = new ServerSocket(port); 
    ServerSocket socket2 = new ServerSocket(port1); 
    while (true) { 
    Socket connection = socket1.accept(); 
    Socket connection1 = socket2.accept(); 

    Runnable runnable =new thready(connection); 
    Runnable run= new thready(connection1); 
    Thread t1=new Thread(runnable); 
    Thread t2=new Thread(run); 
    t1.start(); 
    t2.start(); 
    } 
    } 
    catch(Exception e) 
    { 

    } }} 

Maintenant Im test ce morceau de code à l'aide Hyperterminal et me connecte à la fois le port 890 et le port 81 (am avec 2 instances du HyperTerminal) et si je comprends bien le comportement attendu devrait être que "Connecté au port 'numéro de port" "doit être imprimé dès qu'une connexion à un port (80 ou 81) est établie. Mais la sortie que j'obtiens ici de ce morceau de code est que si je me connecte à seulement 1 port alors la sortie requise n'est pas imprimée et si je me connecte aux deux ports, l'une après l'autre, la sortie est imprimée seulement après les deux ports est connecté. Cela me conduit à nouveau à la confusion initiale quant à savoir si ces deux threads s'exécutent simultanément ou si l'exécution est en alternance entre ces deux threads.

Toutes les suggestions seraient d'une grande aide.

Vive

+0

+1 pour ne pas avoir lu les documents de l'API Java :) – willcodejavaforfood

Répondre

8

Vous appelez accept avant de commencer les discussions. accept bloquera jusqu'à ce qu'une connexion soit établie, c'est pourquoi vous voyez le comportement que vous faites. Si vous voulez écouter sur plusieurs ports, vous devrez [1] créer un thread pour chaque ServerSocket et puis démarrer un fil de communication lorsque le accept retourne ou traiter les connexions une par une dans le fil faisant l'écoute.

[1] Ceci s'applique uniquement si vous utilisez directement ServerSocket, que vous devriez probablement utiliser en cours d'apprentissage. Le package java.nio et ses sous-packages contiennent des classes à utiliser avec des E/S non bloquantes de multiplexage qui peuvent être utilisées pour, par exemple, écouter sur plusieurs sockets dans le même thread.

3

Le code

Socket connection = socket1.t(); 
Socket connection1 = socket2.accept(); 

utilise Socket.accept qui est un procédé de blocage . Voir le javadoc:

Écoute une connexion à faire à cette socket et l'accepte. La méthode bloque jusqu'à ce qu'une connexion soit établie.

3

Vous avez ces 2 lignes

Socket connection = socket1.accept(); 
Socket connection1 = socket2.accept(); 

Maintenant, les blocs de .Accepter() jusqu'à ce qu'une connexion est faite. Cela signifie que votre code attend sur la ligne 2. ci-dessus. Vous ne serez jamais en mesure de démarrer le fil pour «connexion» jusqu'à 2. la connexion est faite.

5

Vous effectuez beaucoup d'initialisation avant de retirer vos threads et de bloquer ceux-ci.

Je déplacerais tout ce code dans le runnable. Ensuite, vous éviterez également ces noms de variables dupliqués tels que connection et connection1, ces objets appartenant à Thready.

0

J'ai modifié un peu le code selon les suggestions et je l'ai fait fonctionner, je suppose. Voici la méthode constructeur et exécuter modifié

public thready(int a) { 
    this.num=a; 
} 
public void run() { 
    try { 
     ServerSocket socket1 = new ServerSocket(num); 
     while(true){ 
     Socket connection = socket1.accept(); 
     BufferedInputStream is = new BufferedInputStream(connection.getInputStream()); 
     System.out.println("Connected to port"+num); 
     } 
    } catch (IOException ex) { 
     //Logger.getLogger(thready.class.getName()).log(Level.SEVERE, null, ex); 
    } 


} 

Cela ne (je suppose) mettre en œuvre des threads concurrents. Merci à tous pour vos suggestions.

+0

Je vous suggère de modifier ceci dans le texte de la question et d'accepter une réponse. – blank