求助多线程方面的问题

2020-12-30 19:42:01 +08:00
 Rever1e

##目的:支线程接受 socket,打断主函数的输入

支线程与主线程并行,支线程等待 Serversocket.accept(),主线程等待 Scanner.next().
现在希望支线程接收 Socket 后,中断主线程输入,继续执行支线程之后内容

##目前

需要的是 lock.wait 在同步代码块外,但是这样语法错误
如果在同步代码块中它一直执行主函数的等待输入

##主线程

Server server = new Server();
    server.initServer(LockServer);
    server.start();

    synchronized (LockClick) {
        synchronized (LockServer){
        while (true) {
            Menu.printMenu();
            Menu.scan(LockClick,LockServer);//看作 Scanner.next()
            System.out.println("----------------");
        }
    }}
    

##支线程

public void run(){
        PrintWriter out=null;
        Scanner get = null;
        try {
            System.out.println("服务正在运行,等待客户端连接!");
            log.write("点对点服务端开启");
            while (true) {
                Socket client = server.accept();
                //接收 socket,打断主线程输入
                //lock.wait();
                synchronized (lock) {
                    lock.wait();
                    InetAddress inetAddress = client.getInetAddress();
                    

具体代码:https://github.com/0x00stone/chat/blob/master/src/Client1/mainThread.java https://github.com/0x00stone/chat/blob/master/src/Client1/Server.java

1327 次点击
所在节点    Java
1 条回复
PUGE
2021-01-06 11:24:49 +08:00
wait ()必须放到 while 循环内,因为可能有虚假唤醒的可能,你这写法很容易死循环啊,推荐用 2 个 semaphore 来做,而且感觉你这需求有点不太对

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/740410

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX