java - 我无法用 if 语句停止线程

标签 java multithreading if-statement semaphore

下面是我的代码

class SecondTextViewTask extends Thread {
        @Override
        public void run() {
            while (true) {
                if (semaphore.availablePermits() == 0 && firstTextDigit <= 9 && secondTextDigit <= 9) {
                    try {
                        Thread.sleep(1000);

                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                secondTextDigit++;
                                secondDigit.setText(String.valueOf(secondTextDigit));
                                Log.e("Test== ", "" + secondTextDigit + " " + semaphore.availablePermits());
                                if (secondTextDigit == 9) {
                                    semaphore.release();
                                }
                            }
                        });

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

首先,我从 0 开始信号量,在 secondTextDigit(integer) 到达 9 后释放信号量,此任务必须停止。但是当我使用 Log.e 时,我可以在我的 Logcat secondTextDigit=10 和我的 semaphore=1 上看到。在这种情况下,if 语句如何工作并进入内部?我的逻辑错误在哪里?
(secondDigit 是 TextView。)

最佳答案

您的初始 if 语句会检查以下内容:

semaphore.availablePermits() == 0 && firstTextDigit <= 9 && secondTextDigit <= 9

这对 secondTextDigit == 9 有效。

然后调用 secondTextDigit++。如果 secondTextDigit == 9,则 secondTextDigit 变为 10。

最后,您释放信号量的条件是 secondTextDigit == 9,如果 secondTextDigit 为 10,则该条件为 false,您会卡住。

关于java - 我无法用 if 语句停止线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49793881/

相关文章:

java - 为什么removeif()在集合流上不可用

java - 如何将存储库名称作为 java 数组传递并在 documentum 代码中迭代它?

java - 如何在注入(inject)时指定拦截器

java - 两个数组中最大的元素

java - 试图停止执行2秒钟

ant - 如何使用 "if-else"模拟 "condition"逻辑?

php - 并行执行而不是 foreach

c# - 检测在 C# 库中的主线程中运行

python - 如果if语句等于错误怎么办?

python - If 语句不起作用 (Python)