V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Rever1e
V2EX  ›  Java

求助多线程方面的问题

  •  
  •   Rever1e · 2020-12-30 19:42:01 +08:00 · 1462 次点击
    这是一个创建于 1402 天前的主题,其中的信息可能已经有所发展或是发生改变。

    ##目的:支线程接受 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

    1 条回复    2021-01-06 11:24:49 +08:00
    PUGE
        1
    PUGE  
       2021-01-06 11:24:49 +08:00
    wait ()必须放到 while 循环内,因为可能有虚假唤醒的可能,你这写法很容易死循环啊,推荐用 2 个 semaphore 来做,而且感觉你这需求有点不太对
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2583 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 11:31 · PVG 19:31 · LAX 04:31 · JFK 07:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.