Java 控制多线程连接的条件

Java 控制多线程连接的条件,java,multithreading,sockets,loops,Java,Multithreading,Sockets,Loops,我实现了一个服务器和两个客户端之间的多线程连接,但是当我启动程序时,服务器启动了一个无限循环。这是一个问题,因为我的服务器还实现了一个图形界面,无法运行,因为它被此循环阻止。我想补救,选择一个不同的条件来停止我的循环,而不是使用while(true)循环。 以下是我的周期代码: public Socket attendi(){ try { System.out.println("inizializzo il server"); ss = new ServerS

我实现了一个服务器和两个客户端之间的多线程连接,但是当我启动程序时,服务器启动了一个无限循环。这是一个问题,因为我的服务器还实现了一个图形界面,无法运行,因为它被此循环阻止。我想补救,选择一个不同的条件来停止我的循环,而不是使用
while(true)
循环。 以下是我的周期代码:

public Socket attendi(){
    try {
       System.out.println("inizializzo il server");
       ss = new ServerSocket(PORT);
       while(true){
           System.out.println("server pronto in ascolto");
           s = ss.accept(); //s is a global Socket object
           ThreadServer newConnection = new ThreadServer();
           newConnection.connect(s);
           System.out.println("connessione stabilita");
       }


    } catch (IOException ex) {
       Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
    }
   return s;
}

当没有更多的客户端尝试连接到服务器时,您能推荐一个好的条件来停止循环吗?

首先,您需要扩展
可运行

public class MyRunnable extends Runnable {

    public void run(){
        try {
           System.out.println("inizializzo il server");
           ss = new ServerSocket(PORT);
           while(true){
               System.out.println("server pronto in ascolto");
               s = ss.accept(); //s is a global Socket object
               ThreadServer newConnection = new ThreadServer();
               newConnection.connect(s);
               System.out.println("connessione stabilita");

               handleConnection(s);
           }
        } catch (IOException ex) {
           Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
然后实现一个守护进程线程工厂。守护进程线程不会阻止应用程序终止:

public class DaemonThreadFactory implements ThreadFactory {
    private ThreadFactory threadFactory = Executors.defaultThreadFactory();

    public Thread newThread( Runnable runnable ) {
        Thread thread = threadFactory.newThread(runnable);
        thread.setDaemon(true);
        return thread;
    }
}
然后使用线程工厂创建线程:

ThreadFactory factory = new DaemonThreadFactory();
Thread thread = factory.newThread( new MyRunnable() );
thread.start();

根据提供的代码和描述,我觉得您实际上并不是在一个单独的线程中运行它。

启动一个新线程,并将此逻辑放入新线程中,这样您的主线程就不会被阻塞

这样,您的主线程只需启动一个新线程并继续执行进一步的程序。新线程将执行您想执行的任何操作(在您的情况下执行一些阻塞操作),而不会阻塞主线程

您可以使用Java的内置功能来实现同样的功能。您不需要返回
s
,因为它是全局变量。见以下代码:

ExecutorService executorService = Executors.newFixedThreadPool(1);

executorService.execute(new Runnable() {
    public void run() {
        try {
       System.out.println("inizializzo il server");
       ss = new ServerSocket(PORT);
       while(true){
           System.out.println("server pronto in ascolto");
           s = ss.accept(); //s is a global Socket object
           ThreadServer newConnection = new ThreadServer();
           newConnection.connect(s);
           System.out.println("connessione stabilita");
       }
    } catch (IOException ex) {
       Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
    }
    }
});

//Now program execution will continue and the new thread created will execute the logic you have placed in `run` method.

这样,当我关闭窗口时,我的循环将停止,对吗?但我的问题是,窗户既没有打开,我的误解。这有帮助吗?:)这将启动一个新线程,但当窗口关闭时,您仍然可能会遇到一个卡住的线程。没问题。但最后您实施了哪种解决方案,这是andy的答案中的一种还是另一种?