[CountDownLatch实现等待TcpServer启动完毕后再发射事件]
背景:
有时候,我们希望NettyServer启动时不能说卡住主线程。
也不能说:直接就启动一个线程,不然没办法发射出“服务器启动”这个事件。
这时就可以使用此类执行完毕后,通知下主线程。
1)TcpServer.java
package org.example.testStart;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
public class TcpServer extends Thread{
// 使用这个在当前线程执行完毕后,立马通知主线程
private final CountDownLatch latch;
public TcpServer(CountDownLatch latch) {
this.latch = latch;
}
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() + " tcpserver start success" );
latch.countDown();
// 相当于netty等待关闭
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2)Main.java
package org.example.testStart;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
public class Main {
public static void main(String[] args) throws InterruptedException {
regHookThread();
System.out.println(Thread.currentThread().getName() + " start!");
initTcpServer();
initTcpServer();
System.out.println(Thread.currentThread().getName() + " end!");
// 等待5s,模拟使用jmx关闭服务器
TimeUnit.SECONDS.sleep(5);
System.exit(1);
}
public static void initTcpServer() throws InterruptedException {
CountDownLatch latch = new CountDownLatch(1);
new TcpServer(latch).start();
// 等待执行完毕
latch.await();
}
public static void regHookThread() {
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
System.out.println(Thread.currentThread().getName() + " hook thread finish!");
}, "gs-hook-thread"));
}
}
/*
main start!
Thread-0 tcpserver start success
Thread-1 tcpserver start success
main end!
gs-hook-thread hook thread finish!
*/
总结:可以看出来,是单独的线程启动,但是可以控制住顺序了。
原文地址:https://blog.csdn.net/themagickeyjianan/article/details/136245447
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!