- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一堂这样的课:
package crossRoadConcurency;
import java.util.List;
public class TourGuide
{
private volatile boolean isGuiding;
private volatile boolean isInShop;
private final Object lockObject = new Object();
private final int id;
public TourGuide(int id)
{
this.isGuiding=false;
this.isInShop=false;
this.id=id;
}
public synchronized boolean isFree()
{
return !isGuiding && !isInShop;
}
public void guide(final Tourist[] tourists)
{
new Thread(new Runnable()
{
@Override
public void run()
{
synchronized (lockObject)
{
while(!isFree())
{
try
{
System.out.println("Guide "+id+" is bussy. Waiting... ");
lockObject.wait();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
isGuiding=true;
System.out.println("Guide "+id+" is guiding "+tourists.length+" tourists");
try
{
Thread.sleep(4000);//lets not wait one hour, shall we?
for (Tourist tourist : tourists)
{
tourist.exit();
}
System.out.println("All tourists exited for guide "+id+". Going to shop");
isInShop=true;
isGuiding=false;//if we invert the way we give these values bad thing may happen
Thread.sleep(4000);
isInShop=false;
System.out.println("Guide "+id+" is free");
synchronized (lockObject)
{
lockObject.notifyAll();
}
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}).start();
}
}
还有另一个类:
package crossRoadConcurency;
import java.util.Random;
public class Tourist
{
public void exit() throws InterruptedException
{
Random random = new Random();
Thread.sleep(random.nextInt(1000));// max one second to exit
}
}
我这样使用:
package crossRoadConcurency;
import java.util.List;
public class Main
{
public static void main(String[] args) throws InterruptedException
{
Tourist[] tourists = new Tourist[20];
for (int i=0;i<tourists.length;i++)
{
tourists[i]=new Tourist();
}
TourGuide guide = new TourGuide(0);
guide.guide(tourists);
Thread.sleep(500);
guide.guide(tourists);
}
}
问题是我得到这个输出:
Guide 0 is guiding 20 tourists
All tourists exited for guide 0. Going to shop
Guide 0 is free
Exception in thread "Thread-0" Guide 0 is guiding 20 tourists
java.lang.IllegalMonitorStateException
at java.lang.Object.notifyAll(Native Method)
at crossRoadConcurency.TourGide$1.run(TourGide.java:60)
at java.lang.Thread.run(Unknown Source)
All tourists exited for guide 0. Going to shop
Guide 0 is free
Exception in thread "Thread-1" java.lang.IllegalMonitorStateException
at java.lang.Object.notifyAll(Native Method)
at crossRoadConcurency.TourGide$1.run(TourGide.java:60)
at java.lang.Thread.run(Unknown Source)
第一个问题:为什么我没有看到“等待输出”第二个问题:为什么我会遇到异常
第三个问题:有没有更好的方法来做到这一点,因为我相当确定这个概念是混淆的
最佳答案
您看不到“等待”,因为默认情况下您的指南是免费的。 !isGuide && !isInShop
返回 true,而您仅在 !isFree()
时打印。
您应该调用lockObject.notifyAll()
。默认情况下,直接调用 notifyAll()
会调用此对象,并且您肯定没有持有实现 Runnable 接口(interface)的匿名对象的监视器,因为您从未通过调用 synchronized(this)
。这就是您获得异常(exception)的原因。
是的。您应该使用 Executor
例如SingleThreadExecutor
与并发队列一起。除非您进行高性能计算,否则这是实现并发的强大而简单的方法。该包还提供了出色的功能和支持实用程序类。查看java.util.concurrent
。
顺便说一句,你的包名包含大写字母,这是java编程规范不推荐的。
关于Java并发: some assistance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23648091/
有人知道是否可以更改 VisualAssist X 存储其符号数据库的文件夹吗? 默认情况下它在 \VisualAssist 最佳答案 取决于 VA 和 Visual Studio 的版本。见 thi
有人知道google assistant SDK可以商用吗? 如果可用,我如何购买其许可证? 最佳答案 根据 Google Assistant SDK Terms of Service ,未经 Goo
使用本指南在我的 pi 上安装 Google 助手:https://developers.google.com/assistant/sdk/guides/library/python/embed/ru
我正在尝试使用元数据定义实体值之间的一些关系。 我已使用 Watson API v1 将元数据上传到实体值。当我通过相同的 API 列出实体时,我可以看到元数据。不过,我无法从 Watson Assi
QT4.8 你好,我正在使用 QProcess 模式连接到 QT-Assistent。 例如(来自QT文档) QProcess *process = new QProcess; QStringList
好的,我一直在我的 Windows 10 PC 上安装 Google 智能助理,但遇到了多个错误,最后一个错误我通过转到此处解决:Google Assistant Installation on Py
我只熟悉Watson Assistant因为我已经用它做了一些工作,但我从未使用过 Watson Assistant Solutions。 它是基于 Watson Assistant 的新 API 还
我有一个应用程序,它使用(完全用户友好的)系统范围键盘 Hook 来实现辅助功能。 当应用程序启动时,我检查是否选中了“启用辅助设备访问”设置,正如其他人在这里询问的那样:Programmatical
我有一堂这样的课: package crossRoadConcurency; import java.util.List; public class TourGuide { private v
目前,谷歌助手SDK接受语音输入,这意味着我的问题相当简单:我想与谷歌助手交谈但不使用语音,只是聊天。这当然是可能的,例如,在 Google Allo 中。谷歌是否公开了用于文本输入的 API? 最佳
我目前正在尝试在一个小型应用程序中使用 Google Guice-3.0。 运行此应用程序时,系统会提示用户输入其姓名和密码。由于此信息直到运行时才知道,所以我使用 AssistedInject实现我
每次我启动Eclipse并按Ctrl + Space时,都会收到以下3个警告弹出窗口。 http://imgur.com/a/2pKdm 它们仅在我第一次按Ctrl + Space时出现。 自重新安装
我使用 Watson Assistant 创建了一个聊天机器人。我通过 API 调用使用它。 假设有两个不同的人想要同时使用我的聊天机器人。那么我必须做什么才能让 Watson 明白是两个不同的人正在
这个问题是关于 Guice @Assisted 和 @Provides 的正确用法以及如何使用。 我目前引用的设计是这样的:层次结构顶部的类也是唯一暴露给客户端的类(基本上是公共(public) AP
在我的 Android 项目中,我们最近在文档之后添加了语音搜索。它工作正常,但仅在搜索一个词时有效。这似乎不是预期的行为,因为在 Google 的示例中他们搜索“毛伊岛之旅”。 我们使用 Googl
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我已经尝试了我发现的每一个简单的组合,但不确定如何做到这一点。我什至尝试模拟家庭长按,但你现在得到谷歌语音,看看 logcat 它显示了这个 com.google.android.googlequic
就在 iPhone 应用程序中为用户提供漂亮的文本弹出窗口而言,在用户单击帮助图标后,人们推荐什么方法/样式? 在我看来(关于用户体验)我会想到这样的话: 有一个细边框,周围有圆边 占据了大部分屏幕
我有一个 UITableView,每个 UITableViewCell 都有一个像背景 UIView 一样的黑卡。黑卡并非完全不透明,而是具有 0.6 的 alpha。当我上下移动滚动条时,一切看起来
我们将 Qt 助手用作新的帮助文件系统。但由于我们拥有国际客户群,我们希望以不同的语言启动 Qt 助手。 如您在下面的代码片段中所见,使用生成的 QHC 文件启动助手根本不是问题。 QProce
我是一名优秀的程序员,十分优秀!