为什么线程不能在java中并行运行?

时间:2014-08-30 20:02:42

标签: java multithreading

我正在尝试实现一个启动两个线程的程序,其中一个线程永远循环接收端口上的对象,然后将它们添加到线程之间共享的数组列表中,另一个线程永远循环接收命令从共享的数组列表中删除一个对象。

这是实例化那些线程的代码

主机是主类,包含两个类注册和注销(线程)

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();
        }
    }
}

我的问题是,实际上唯一活动并且正在侦听对象的线程是第一个实例化的,为什么它们实际上不是并行运行并且同时都在监听?

1 个答案:

答案 0 :(得分:7)

您没有使用run启动帖子。您可以使用start()启动它。

t.run()仅在当前(主)线程上运行run()方法,这就是未达到t1.run()的原因。

将其更改为t.start()t1.start()