java - 多线程-奇偶数

标签 java multithreading

通过 2 个 diss 线程交替打印奇数/偶数。程序并未结束。 EVEN 线程处于等待状态。尝试在 while 循环外部添加“notifyAll()”。另外,如果我在 while 循环之外设置 EvenFlag/oddFlag,线程名称会更改回 Thread1 和 Thread2,不知道为什么..

import java.util.concurrent.Callable;
import java.util.concurrent.locks.Lock;

public class MultiThreading {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Runnable r = new PrintNum();
        Thread t0 = new Thread(r, "ZERO");
        Thread todd = new Thread(r, "Thread1");
        Thread teven = new Thread(r, "Thread2");
        t0.start();
        todd.start();
        teven.start();
    }

    public static class PrintNum implements Runnable {
        boolean zeroFlag = true;
        boolean evenFlag = false;
        boolean oddFlag = false;
        int count = 0;
        int limit = 100;

        @Override
        public void run() {
            synchronized (this) {
                while (count <= limit) {
                    if (zeroFlag) {
                        System.out.println(Thread.currentThread().getName() + ":" + count);
                        count++;
                        zeroFlag = false;
                        oddFlag = true;
                        break;
                    }
                    if (evenFlag) {
                        if (count == 2)
                            Thread.currentThread().setName("EVEN");
                        System.out.println(Thread.currentThread().getName() + ":" + count);
                        count++;
                        evenFlag = false;
                        oddFlag = true;
                        notify();
                        while (!evenFlag) {
                            try {
                                wait();
                            } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }

                    }
                    if (oddFlag) {
                        if (count == 1)
                            Thread.currentThread().setName("ODD");
                        System.out.println(Thread.currentThread().getName() + ":" + count);
                        count++;
                        evenFlag = true;
                        oddFlag = false;
                        notify();
                        while (!oddFlag) {
                            try {
                                wait();
                            } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
        }
    }
}

最佳答案

我不想表现得无礼,在学习时提问是可以的,但看起来你是在试图让 Stackoverflow 上的某人完成你的作业……

只需在 while block 之后的 run 方法中添加以下几行,否则您的线程之一将保持等待状态。

evenFlag = true;
oddFlag = true;
notify();

尝试添加 System.out.println/debug 行,看看下次发布问题之前会发生什么。另外,尝试使用 Java 并发 API,而不是手动同步线程,AtomicInteger 将在几行代码中完成您在此处尝试执行的操作。

关于java - 多线程-奇偶数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48528132/

相关文章:

java - 从另一个组件更新组件的状态

java - Android AsyncTask 如何设置定时器

multithreading - 我的代码中的随机访问违规

c++ - 线程什么时候退出?

java - 在两个同步块(synchronized block)和多个 volatile 读/写的情况下重新排序

java - 缺少 Jacoco 代码覆盖率和 IncompleteClassChangeError

java - JSpinner 获取最大最小值

java - lucene 在查询中获取匹配项

java - Android AppUpdateManager 未初始化自动更新

python - Python 中的简单线程示例