2014-08-30 103 views
-2

我想實現一個啓動兩個線程的程序,其中一個線程永遠循環接收端口上的對象,然後將它們添加到線程之間共享的數組列表中,另一個線程永遠循環以接收要刪除的命令一個來自數組列表中的共享對象。爲什麼線程不能在java中並行運行?

這裏是實例化這些線程的代碼

主機是它包含兩個類註冊和註銷(螺紋)

static ArrayList<User> Clients=new ArrayList<User>(); 
Host.register reg=h.new register(); 
Thread t=new Thread(reg); 
t.run(); 
Host.deregister dereg=h.new deregister(); 
Thread t1=new Thread(dereg); 
t1.run(); 

,這裏是在螺紋本身

public class register implements Runnable{ 
    private static final int PORT = 9111; 
    @Override 
    public void run() { 
     listen(); 
    } 
    public void listen(){ 
     try { 
      ServerSocket s=new ServerSocket(PORT); 
      while(true){ 
       Socket clsocket=s.accept(); 
       User recUser=null; 
       ObjectInputStream in = new ObjectInputStream(clsocket.getInputStream()); 
       recUser=(User)in.readObject(); 
       Clients.add(recUser); 
       in.close(); 
       clsocket.close(); 
       System.out.println(Clients.size()+" reg"); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

public class deregister implements Runnable{ 
    private static final int PORT = 9999; 
    @Override 
    public void run() { 
     listen(); 
    } 
    public void listen(){ 
     try { 
      ServerSocket s=new ServerSocket(PORT); 
      while(true){ 
       Socket clsocket=s.accept(); 
       User recUser=null; 
       ObjectInputStream in = new ObjectInputStream(clsocket.getInputStream()); 
       recUser=(User)in.readObject(); 
       Clients.remove(recUser); 
       in.close(); 
       clsocket.close(); 
       System.out.println(Clients.size()+" dereg"); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
主類

我的問題是,唯一實際活動和偵聽對象的線程是實例化的第一個線程,爲什麼它們不是實際並行運行並且是機器人h在同一時間聽?

+1

我不認爲這會按預期工作。我的理解是,你可以有多個線程監聽的端口上,但__only__ 1將收到數據報,使整個事情沒有實際意義。 有話偵聽的端口,並生成線程的處理數據,而不是。 – rollingBalls 2014-08-30 20:08:50

回答

5

你不用run開始線程。你從start()開始。

t.run()只在當前(主)線程上運行run()方法,這就是爲什麼沒有達到t1.run()的原因。

將其更改爲t.start()t1.start()

相關問題