gpt4 book ai didi

java - 使用使用 Runnable 的线程和派生的 Thread 类之间的行为存在意外差异

转载 作者:行者123 更新时间:2023-11-29 07:20:35 25 4
gpt4 key购买 nike

Q:我需要详细解释下面代码的输出...使用runnable接口(interface)创建的线程和直接扩展线程类创建的线程有什么区别...???

问题 1:

public class BalanceChecker1{
public static void main(String [] args) {
RunnableClass runnableClass=new RunnableClass();
new Thread(runnableClass).start();
new Thread(runnableClass).start();
}
}

class RunnableClass implements Runnable{
Bean bean=new Bean();
public void run(){
synchronized(bean){
bean.incBalance();
}
}
}

class Bean{
private int balance=0;
public void incBalance(){
balance++;
System.out.println(" The thread name "+Thread.currentThread().getName());
System.out.println(" The balance is "+balance);
}
}

输出:

 The thread name Thread-0 The balance is 1 The thread name Thread-1 The balance is 2

Q2:

public class BalanceChecker1{
public static void main(String [] args){
new specialThread().start();
new specialThread().start();
}
}
class specialThread extends Thread{
Bean bean=new Bean();
public void run(){
synchronized(bean){
bean.incBalance();
}
}
}

class Bean{
private int balance=0;
public void incBalance(){
balance++;
System.out.println(" The thread name "+Thread.currentThread().getName());
System.out.println(" The balance is "+balance);
}
}

输出:

 The thread name Thread-0 The thread name Thread-1 The balance is 1 The balance is 1

最佳答案

这两个示例之间的重要区别是 Runnable 与扩展Thread(不相关的注释:几乎从来没有理由要扩展 Thread,您几乎总是希望实现 Runnable

重要的区别在于,在第一个示例中,两个正在运行的线程共享一个共同的 Bean 对象,它们在该对象上进行同步!这意味着对 incBalance() 的调用不能同时由两个线程执行。

在第二个示例中,它们各有一个单独的 Bean 对象,因此同步没有实际效果。

另请注意,不能保证您发布的输出:您可以在第二个示例中获得与第一个示例中相同的输出(但是,您无法从第一个示例中获得第二个示例的混合输出)。

关于java - 使用使用 Runnable 的线程和派生的 Thread 类之间的行为存在意外差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5216638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com