public class TestSynchronized{ public static void main(String[]args){ TestThread tt=new TestThread(); new Thread(tt).start(); new Thread(tt).start(); new Thread(tt).start(); new Thread(tt).start(); System.out.println(Thread.activeCount()); } } class TestThread implements Runnable{ int num=10; Object obj=new Object(); public void run(){ while(true){ synchronized (obj){ if(num>0){ try{ Thread.sleep(800); System.out.println(Thread.currentThread().getName()+”卖了第”+num+”套房子”); num--; }catch(Exception e){ e.getMessage(); } } } if(num==0){ System.exit(0); } } } }
时间: 2024-02-10 10:08:02 浏览: 25
这段代码演示了一个简单的售房程序,使用了 synchronized 块来保证线程安全。下面是该程序的执行过程和输出:
1. 主线程启动了四个子线程,每个子线程都使用同一个 TestThread 对象。
2. 在 TestThread 对象的 run() 方法中,每个线程都会无限循环,直到所有房子均已售出。
3. 在 synchronized 块内,线程会判断当前是否还有房可售,若已售完则退出循环。
4. 如果还有房可售,则线程会获取 obj 对象的锁,并进行售房的操作。在售房过程中,线程会模拟一定的耗时操作,然后输出卖房信息。
5. 在 synchronized 块外,线程会判断所有房子是否已售完,如果是则调用 System.exit(0) 方法退出程序。
6. 在输出中,我们可以看到每个线程都在交替卖房,直到所有房子均已售出,程序才退出。
```
4
Thread-2卖了第10套房子
Thread-3卖了第9套房子
Thread-0卖了第8套房子
Thread-1卖了第7套房子
Thread-2卖了第6套房子
Thread-3卖了第5套房子
Thread-0卖了第4套房子
Thread-1卖了第3套房子
Thread-2卖了第2套房子
Thread-3卖了第1套房子
```
相关问题
public class SmallChangeSysApp { public static void main(String[] args) { SmallChangeSysOOP sys = new SmallChangeSysOOP(); sys.mainMenu(); } }功能
这段代码是一个 Java 程序的入口,它创建了一个 SmallChangeSysOOP 的实例,并调用了它的 mainMenu 方法。SmallChangeSysOOP 可能是一个小额零钱管理系统的类或程序,mainMenu 可能是该系统的主菜单方法。通过调用该方法,用户可以进入系统并开始使用它的功能。
public class StringBuilder { public static void main(String[] args) { StringBuilder sb=new StringBuilder(); sb.append("hello") } }其中append无法调用
根据你提供的代码,问题出在你的代码中定义了一个名为`StringBuilder`的类,这与Java标准库中的`java.lang.StringBuilder`类重名了,导致编译器无法识别你自定义的`StringBuilder`类中的`append`方法。
解决这个问题的方法是避免与Java标准库中的类重名。你可以将你自定义的类命名为其他名称,例如`MyStringBuilder`,这样就不会与标准库中的类产生冲突。
修改后的代码如下:
```java
public class MyStringBuilder {
public static void main(String[] args) {
MyStringBuilder sb = new MyStringBuilder();
sb.append("hello");
}
public void append(String str) {
// 实现你自己的append方法逻辑
// ...
}
}
```
请确保在自定义类中实现了`append`方法的逻辑,这里只是给出了一个示例框架。这样你就可以在`MyStringBuilder`类的实例上调用`append`方法了。