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的答案中的一种还是另一种?