没有Thread.sleep(...)调用,线程代码无法正常工作

kde*_*den 2 java multithreading

我有以下代码:

public class ThreadTest implements Runnable {
    public int ThrCount    = 0;

    public void ThrCountIncr() {
        while (true) {
            ThrCount++;
            System.out.println(ThrCount);
            try {
                Thread.currentThread().sleep(500);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    public void run() {
        while (true) {
            if (ThrCount > 10) {
                System.out.println(ThrCount + "\n Thread finished");
                System.exit(1);
            }
            try {
                Thread.currentThread().sleep(100);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我从中删除此行时run,它将停止工作:

Thread.currentThread().sleep(100);
Run Code Online (Sandbox Code Playgroud)

首先,我启动线程,然后我使用ThrCountIncr.

ThreadTest Thrtest = new ThreadTest();
Thread thr = new Thread(Thrtest);
thr.start();
Thrtest.ThrCountIncr();
Run Code Online (Sandbox Code Playgroud)

线程检查ThrCount变量值,如果大于10,则停止程序.没有sleep(100),线程不会停止程序,我认为它不会检查变量值.为什么要调用sleep此代码?

ass*_*ias 11

即使Thread.sleep()它可能不起作用.这是因为您没有正确地同步对共享ThrCount变量的访问.

如果您使用该变量volatile,则不应再看到任何问题.然而,由于++操作不是原子的,它可能不会完全循环10次.

理想情况下,您应该使用AtomicInteger并使用其incrementAndGet()方法.

另请注意:

  • Java的命名约定:变量和方法的名称应小写开始(thrCount,thrCountIncr()
  • sleep是一个静态方法,所以你可以简单地调用Thread.sleep(...);它,它将在当前线程中休眠.