- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在尝试运行两个相互依赖的线程时,我似乎遇到了有关死锁的问题。
代码是这样的:
Box.Java(主要)
package exe4;
public class Box {
private static boolean boxStatus;
static Thread boxThread = Thread.currentThread();
public Box(){
Box.boxStatus = true;
}
public static void main(String[] args) throws InterruptedException{
Box box = new Box();
Shop shop = new Shop(box, "Post Office");
Customer customer = new Customer(box, "Daniel Netzer");
shop.run();
customer.run();
Thread.sleep(60000);
}
public boolean isBoxStatus() {
return boxStatus;
}
public void setBoxStatus(boolean boxStatus) {
Box.boxStatus = boxStatus;
}
}
Shop.java
package exe4;
public class Shop implements Runnable{
private static Box box;
private static String name;
private static Object shopLock = new Object();
public Shop(Box box, String name){
Shop.box = box;
Shop.name = name;
}
public static Object getShopLockMonitor(){
return Shop.shopLock;
}
public String getName() {
return name;
}
public synchronized void setName(String name) {
Shop.name = name;
}
public static Box getBox() {
return box;
}
public synchronized void setBox(Box box) {
Shop.box = box;
}
public synchronized void depositBox(){
Shop.box.setBoxStatus(true);
synchronized(Customer.getCustomerLockMonitor()){
Customer.getCustomerLockMonitor().notifyAll();}
}
public synchronized void printDeposit(){
System.out.println("New package have been deposited into your box.");
}
@Override
public void run() {
while(Box.boxThread.isAlive()){
while(box.isBoxStatus()){
synchronized(Shop.getShopLockMonitor()){
try {
System.out.println("Box is full, waiting for customer withdrawal.");
Shop.getShopLockMonitor().wait();
} catch (InterruptedException e) {}
}
}
depositBox();
printDeposit();
}
}
}
客户.java
package exe4;
public class Customer implements Runnable{
private static Box box;
private static String name;
private static Object customerLock = new Object();
public Customer(Box box, String name){
Customer.box = box;
Customer.name = name;
}
public static Object getCustomerLockMonitor(){
return Customer.customerLock;
}
public String getName() {
return name;
}
public synchronized void setName(String name) {
Customer.name = name;
}
public static Box getBox() {
return box;
}
public synchronized void setBox(Box box) {
Customer.box = box;
}
public synchronized void withdrawBox(){
Customer.box.setBoxStatus(false);
synchronized(Shop.getShopLockMonitor()){
Shop.getShopLockMonitor().notifyAll();}
}
public synchronized void printWithdraw(){
System.out.println("Package have been withdrawed from box.");
}
@Override
public void run() {
while(Box.boxThread.isAlive()){
while(!box.isBoxStatus()){
synchronized(Customer.getCustomerLockMonitor()){
try {
System.out.println("Box is empty, waiting for a new package to arrive.");
Customer.getCustomerLockMonitor().wait();
} catch (InterruptedException e) {}
}
}
withdrawBox();
printWithdraw();
}
}
}
我没有从控制台收到任何错误,但它只打印我首先运行的线程上的第一个 syso。第二个线程似乎根本没有运行。它不会检索包裹或插入包裹,也不会释放锁。任何有关如何解决此问题的帮助/建议都将受到赞赏,如果有人有好的设计模式技巧,我将非常乐意学习。
顺便说一句,该程序基本上模拟了一个盒子,它可以一次容纳 1 个包裹,如果满了,顾客就会拉出包裹,如果空了,商店就会放入 1 个包裹。
编辑:
它与建议的重复内容不同,因为在另一个问题中没有主线程的 java 代码,因此它不包含我自己问题的答案。
最佳答案
您在单个线程中调用 Shop 和 Customer 的 run() 方法,而不创建线程。
将 shop.run();
替换为 new Thread(shop).start()
将 customer.run();
替换为 new Thread(customer).start()
为他们启动新线程
或者你可以扩展Thread而不是实现Runnable(它无论如何都实现Runnable)并像你一样重写Run方法并直接调用它们的start()方法。
关于Java死锁,2个线程似乎互相阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34475530/
我有类似下面的代码: ... id: myComponent signal updateState() property variant modelList: [] Repeater { mo
我正在处理一些我无法展示的私有(private)代码,但我已经制作了一些示例代码来描述我的问题: 主.c: #include #include #include #include typede
这个问题在这里已经有了答案: 关闭10 年前。 Possible Duplicate: what are the differences in die() and exit() in PHP? 我想
在编写 Perl 模块时,在模块内部使用 croak/die 是一个好习惯吗? 毕竟,如果调用者不使用 eval block ,模块可能会使调用它的程序崩溃。 在这些情况下,最佳做法是什么? 最佳答案
我有一些搜索线程正在存储结果。我知道当线程启动时,JVM native 代码会代理在操作系统上创建新 native 线程的请求。这需要 JVM 之外的一些内存。当线程终止并且我保留对它的引用并将其用作
我刚刚花了很多时间调试一个我追溯到 wantarray() 的问题。 .我已将其提炼为这个测试用例。 (忽略 $! 在这种情况下不会有任何有用信息的事实)。我想知道为什么wantarray在第二个示例
我看到一些代码是这样做的: if(something){ echo 'exit from program'; die; } ...more code 和其他只使用 die 的人: if
我正在尝试将此表格用于: 如果任何 $_POST 变量等于任何其他 $_POST 变量抛出错误。 如果只有几个,那不是问题,但我有大约 20 个左右所以如果我想这样做,我将不得不像这样 但这
每次我运行: hadoop dfsadmin -report 我得到以下输出: Configured Capacity: 0 (0 KB) Present Capacity: 0 (0 KB) DFS
我是一名优秀的程序员,十分优秀!