java—如何创建线程,等待它执行特定的操作,然后继续?

up9lanfz  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(310)

我对线程有点陌生,似乎在网上找不到我需要的东西。我试图解决的问题是让多个客户机连接到一个服务器,并同时运行。客户机的数量是任意的,客户机应该可以随时连接。为此,我创建了“server”类,它存储有关客户机的所有信息,基本上就是中心。然后我有一个助手类“userthread”,它实现runnable,每个userthread都可以连接到一个客户机。我遇到的问题是同时运行多个用户线程。以下是我目前在server类中用于创建新userthreads的代码:

int currentPort = 1;
    while (true) {
        System.out.println(currentPort);
        System.out.println("waiting for user to connect");
        Thread thread = new Thread(new UserThread(currentPort, this));
        thread.start();
        // A
        System.out.println("Connected");
        currentPort++;
    }

下面是userthread的run方法:

public void run() {
    try {
        ServerSocket serverSocket = new ServerSocket(port);
        Socket socket = serverSocket.accept();
        // B
    } catch (Exception e) {
        e.printStackTrace();
    }
    // down here doesn't effect my question so I excluded it
 }

我在每一篇文章中都把a和b标记为注解。最初,当我只是使用运行的userthread的单个示例进行测试时,我能够用“user.join();”替换这允许userthread运行,但它停止了服务器中的while循环。我需要的,可能不是我认为的那样存在的,是一些代码放在点a中,暂停while循环,直到在userthread中调用行b。然后,服务器和新的用户线程都将继续同时工作。如果另一个用户连接到服务器,则会创建另一个userthread,这三个线程都将继续工作。这应该适用于任意数量的连接用户。到目前为止,我已经尝试用“user.wait()”替换a,用“this.notify()”替换b,但我认为这两种方法都没有达到我认为的效果。user.wait()最终抛出“java.lang.illegalmonitorstateexception:当前线程不是所有者”。我试着用我在网上看到的一篇文章中的synchronized(user){}来包围它,但它仍然抛出了相同的异常。在这一点上我很迷茫,所以我希望任何可能的见解。是否存在这样的代码行来替换a和b,或者我以完全错误的方式处理这个问题?谢谢你的帮助。

zpjtge22

zpjtge221#

这里有几个问题:

等待并通知

他们会在这里工作,但你不能打电话 x.wait/notify/notifyAll 除非你在 synchronized(x) 阻止。而 x.wait() 在等待,你不会握着那把锁;一旦wait()返回,您将重新获得它。

这不是怎么做的

你做了一个单人 ServerSocket 对象,以及一个将重复执行此操作的线程:
呼叫 accept() 在serversocket对象上。
创建新线程;把它递给我 Socket 从那个电话里说出来的。
开始那条线
回到开头
您的解决方案很奇怪,而且确实需要同时启动所有线程,监听大量端口(没有特殊原因),从而严重限制传入连接。
然后,如果您想让这些线程中的任何一个等待直到某个事件发生,可以使用wait/notify,或者更好的方法,比如使用j.u.c.的东西, CountDownLatch 允许您安全地等待x个事件发生,例如,让用户线程对闩锁进行倒计时,并让其他线程等待4个倒计时:这就是您编写等待4个连接进入的软件的方式。
关于如何在java中执行多线程的完整教程只是超出了合理问题的范围。

相关问题