java - 通知不让线程脱离等待状态

标签 java multithreading

我正在尝试使用 2 个线程。 1 个线程仅打印奇数,另一个线程仅打印偶数,这必须是替代操作。

例如:

Thread1 1
Thread2 2
Thread1 3
Thread2 4
and so on..

下面是程序,请告诉我哪里出了问题,因为即使线程2通知它,线程1也没有退出等待状态..

    public class ThreadInteraction {

    public static void main(String[] args) {
        new ThreadInteraction().test();
    }

    private void test() {
        ThreadA ta = new ThreadA();
        Thread t = new Thread(ta);
        t.start();

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e1) {
            e1.printStackTrace();
        }

        for(int i=2;i<=50;){
            System.out.println("Thread2 "+i);
            synchronized (t) {
                try {
                    t.notify(); 
                    t.wait();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            i=i+2;
        }
    }
}

    class ThreadA implements Runnable{
        @Override
        public void run() {
            for(int i=1;i<50;){
                System.out.println("Thread1 "+i);
                synchronized (this) {
                        try {
                            notify();                           
                            wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                }
                i=i+2;
            }
        }
    }

最佳答案

问题是,在一种情况下,您正在锁定 Thread t [synchronized (t) ],而在另一种情况下,您正在锁定 TheadA 对象本身 [synchronized (这个)]。

如果您希望线程彼此通信,那么两个线程都应该锁定同一个对象,然后等待通知才会按您的预期工作。

编辑:

您的程序中还有另一个问题,您没有使用任何变量在两个线程之间进行协调。所以你可能会看到像这样的输出 2,1,4,3...等等。要点是线程将交替工作,但不是按顺序工作。 因此,您应该在两个线程之间共享一个变量,该变量应该递增。 第二个问题是您没有处理虚假的唤醒调用[阅读一些有关此的文档],您应该始终在 while 循环内调用 wait。

关于java - 通知不让线程脱离等待状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19206387/

相关文章:

c - 每个 POSIX 线程的不同标准流

C++1z协程线程上下文和协程调度

java - java STDIN nextLine() 中的扫描器

java - java中的DecimalFormat df = new DecimalFormat ("#,###.00")

java - 编码字符串的 Http get/post

java - 您可以分配唯一的线程 ID 并从外部程序访问线程吗?

将 mpi 与 openMP 结合起来

java - JDBC 返回带有正确语句的 MySQLSyntaxError 异常

java - 将带有 java envers 的审计表移动到新的数据库实例

c++ - boost 互斥量和线程