java - 线程休眠的问题?

查看:262
本文介绍了java - 线程休眠的问题?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

初学多线程,关于sleep有个地方不明白。

代码

package controller;

public class ALogin extends Thread {
    // 假设一个A用户登录
    @Override
    public void run() {
        LoginServlet.doPost("a", "aa");
    }

}

package controller;

public class BLogin extends Thread {
    // 一个B用户登录
    @Override
    public void run() {
        LoginServlet.doPost("b", "bb");
    }
}

package controller;

/**
 * 实现一个解决非线程安全问题
 * 
 * @author Joy
 * 
 */
// 模拟一个servlet
public class LoginServlet {
    static String usernameRef;
    static String passwordRef;

     public static void doPost(String username, String password) {
        try {
            usernameRef = username;
            if (username.equals("a")) {
                // 线程休眠(暂停)5秒
                Thread.sleep(5000);
            }
            passwordRef = password;
            System.out.println("username=" + usernameRef + " password="
                    + passwordRef);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

package TestMain;

import controller.ALogin;
import controller.BLogin;

public class TestMain {
    public static void main(String[] args) {
        // 产生非线程安全,值被改变
        // A线程一开始会进入休眠状态5秒,然后是B线程启动执行。        
        ALogin a = new ALogin();
        a.start();
        
        BLogin b = new BLogin();
        b.start();
    }
}

运行结果

    username=b password=bb
    username=b password=aa

网上的解释线程

刚开始a线程暂停五秒,然后b线程执行,打印第一行。
5秒结束后,a线程难道不会启动吗?第二行为什么出现不同值情况?刚看多线程,不太理解,参考书籍《Java多线程编程核心技术》但书中没有解释这个结果,望解答

解决方案

usernameRef和passwordRef 是多个线程共享变量,多线程访问,需要同步处理。

这篇关于java - 线程休眠的问题?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆