在Java中使用notify时,线程和可运行之间有什么区别吗?

当我尝试对Java中的notify()进行测试时,发现有些困惑。

在这里,我有两个线程b1和b2,它们具有对另一个线程a的引用。在b1和b2中,它们将调用wait()。在线程a中,它将调用notify()。据我所知,它将调用b1或b2重新开始。当我使用Runnable实现这一点时,确实如此。但是当我使用Thread意识到这一点时,b1和b2都重新开始。有人可以解释吗?

这是代码。

使用Runnable实现:

线程A:

public class threada implements Runnable{

    @Override
    public void run() {
        // TODO Auto-generated method stub
        String name = Thread.currentThread().getName();
        System.out.println(name+" started");
        synchronized(this){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println(name + "end");
            notify();
        }
    }
}

线程B:

public class threadb implements Runnable{

    private threada ta;
    public threadb(threada a){
        ta = a;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        String name = Thread.currentThread().getName();
        System.out.println(name + " started");
        synchronized(ta){
            try {
                ta.wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println(name + "end");
        }
    }

}

主要:

public class threadmain {
    public static void main(String...args){
        threada a = new threada();

        threadb b1 = new threadb(a);
        threadb b2 = new threadb(a);

        new Thread(b1, "b1").start();
        new Thread(b2, "b2").start();

        new Thread(a, "a").start();
    }
}

结果:

b1 started
a started
b2 started
aend
b1end

使用线程实现:

线程A:

public class ThreadA extends Thread{

    @Override
    public void run() {
        String name = Thread.currentThread().getName();
        System.out.println(name+" started");
        synchronized(this){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println(name + "end");
            notify();
        }
    }
}

线程B:

public class ThreadB extends Thread{

    private ThreadA ta;
    public ThreadB(ThreadA a){
        ta = a;
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
//      super.run();
        String name = Thread.currentThread().getName();
        System.out.println(name + " started");
        synchronized(ta){
            try {
                ta.wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println(name + "end");
        }
    }
}

主要:

public class ThreadMain {
    public static void main(String... args) throws InterruptedException {
        ThreadA a = new ThreadA();

        ThreadB b1 = new ThreadB(a);
        ThreadB b2 = new ThreadB(a);
        b1.setName("b1");
        b2.setName("b2");

        b1.start();
        b2.start();

        Thread.sleep(10);

        a.setName("a");
        a.start();
    }
}

结果:

b1 started
b2 started
a started
aend
b1end
b2end
黎明守护者

有趣的是,您的问题的解决方案记录在Thread.join()中。

当线程终止时,this.notifyAll方法被调用

因此,您的一个线程被notify()调用唤醒,另一个线程被线程A结束并因此notifyAll()本身发送了一个a 因此,每次线程死亡时,等待它的所有事物都会唤醒。

对于Runnable版本,这没有发生,因为等待是链接到Runnable对象而不是线程。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

dataWithContentsOfURL(线程)和dataTaskWithURL之间有什么区别吗?

来自分类Dev

线程和之间有什么区别

来自分类Dev

在Flutter中使用GestureDetector和Button获得可访问性之间有什么区别吗?

来自分类Dev

$ @和“ $ @”之间有什么区别吗?

来自分类Dev

使用媒体查询时,iPhone 4和iPhone 5之间有什么区别吗?

来自分类Dev

ExecutorService的execute和thread.run在Java中同时运行线程之间有什么区别?

来自分类Dev

“ seda + parallelConsumers”和“ direct +线程”之间有什么区别

来自分类Dev

异步方法和线程之间有什么区别?

来自分类Dev

超线程和多核之间有什么区别?

来自分类Dev

“ seda + parallelConsumers”和“ direct +线程”之间有什么区别

来自分类Dev

Intellij:“运行”和“运行...”之间有什么区别

来自分类Dev

“运行配置...”和“调试配置...”之间有什么区别吗

来自分类Dev

Puppet中的notify函数和notify资源之间到底有什么区别?

来自分类Dev

运行流量和流量检查之间有什么区别?

来自分类Dev

类型和类之间有什么区别吗?

来自分类Dev

== null和.equals(“ null”)之间有什么区别吗?

来自分类Dev

Activityname.this()和this之间有什么区别吗?

来自分类Dev

lambda函数中[=]和[&]之间有什么区别吗?

来自分类Dev

strlen和strlen之间有什么区别吗?

来自分类Dev

svg和png img之间有什么区别吗?

来自分类Dev

CassandraCSharpDriver和YugaByteCassandraCSharpDriver之间有什么区别吗?

来自分类Dev

/ etc和/ private / etc之间有什么区别吗?

来自分类Dev

lambda函数中[=]和[&]之间有什么区别吗?

来自分类Dev

strlen和strlen之间有什么区别吗?

来自分类Dev

nvprof 和 pgprof 之间有什么区别吗?

来自分类Dev

使用“或”运算符和使用多个子句之间有什么区别吗?

来自分类Dev

在Scala defs中使用和不使用“ =”之间有什么区别?

来自分类Dev

在Python中使用类和不使用类之间有什么区别

来自分类Dev

C语言中的random和Java语言中的random之间有什么区别吗?

Related 相关文章

  1. 1

    dataWithContentsOfURL(线程)和dataTaskWithURL之间有什么区别吗?

  2. 2

    线程和之间有什么区别

  3. 3

    在Flutter中使用GestureDetector和Button获得可访问性之间有什么区别吗?

  4. 4

    $ @和“ $ @”之间有什么区别吗?

  5. 5

    使用媒体查询时,iPhone 4和iPhone 5之间有什么区别吗?

  6. 6

    ExecutorService的execute和thread.run在Java中同时运行线程之间有什么区别?

  7. 7

    “ seda + parallelConsumers”和“ direct +线程”之间有什么区别

  8. 8

    异步方法和线程之间有什么区别?

  9. 9

    超线程和多核之间有什么区别?

  10. 10

    “ seda + parallelConsumers”和“ direct +线程”之间有什么区别

  11. 11

    Intellij:“运行”和“运行...”之间有什么区别

  12. 12

    “运行配置...”和“调试配置...”之间有什么区别吗

  13. 13

    Puppet中的notify函数和notify资源之间到底有什么区别?

  14. 14

    运行流量和流量检查之间有什么区别?

  15. 15

    类型和类之间有什么区别吗?

  16. 16

    == null和.equals(“ null”)之间有什么区别吗?

  17. 17

    Activityname.this()和this之间有什么区别吗?

  18. 18

    lambda函数中[=]和[&]之间有什么区别吗?

  19. 19

    strlen和strlen之间有什么区别吗?

  20. 20

    svg和png img之间有什么区别吗?

  21. 21

    CassandraCSharpDriver和YugaByteCassandraCSharpDriver之间有什么区别吗?

  22. 22

    / etc和/ private / etc之间有什么区别吗?

  23. 23

    lambda函数中[=]和[&]之间有什么区别吗?

  24. 24

    strlen和strlen之间有什么区别吗?

  25. 25

    nvprof 和 pgprof 之间有什么区别吗?

  26. 26

    使用“或”运算符和使用多个子句之间有什么区别吗?

  27. 27

    在Scala defs中使用和不使用“ =”之间有什么区别?

  28. 28

    在Python中使用类和不使用类之间有什么区别

  29. 29

    C语言中的random和Java语言中的random之间有什么区别吗?

热门标签

归档