我正在尝试实现一个启动两个线程的程序,其中一个线程永远循环接收端口上的对象,然后将它们添加到线程之间共享的数组列表中,另一个线程永远循环接收命令从共享的数组列表中删除一个对象。
这是实例化那些线程的代码
主机是主类,包含两个类注册和注销(线程)
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();
}
}
}
我的问题是,实际上唯一活动并且正在侦听对象的线程是第一个实例化的,为什么它们实际上不是并行运行并且同时都在监听?
答案 0 :(得分:7)
您没有使用run
启动帖子。您可以使用start()
启动它。
t.run()
仅在当前(主)线程上运行run()
方法,这就是未达到t1.run()
的原因。
将其更改为t.start()
和t1.start()
。