2014-08-30 75 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()

相关问题