我知道文档说该对象是线程安全的,但这是否意味着所有方法对它的所有访问都是线程安全的?因此,如果我一次从多个线程调用put()并在同一个实例上调用(),那么会发生什么不好的事情吗?
我问,因为这个答案让我第二次猜测:https: //stackoverflow.com/a/22006181/4164238
我有这样的数据结构:
BlockingQueue mailbox = new LinkedBlockingQueue();
我正在尝试这样做:
for(Mail mail: mailbox)
{
if(badNews(mail))
{
mailbox.remove(mail);
}
}
Run Code Online (Sandbox Code Playgroud)
显然循环的内容会干扰边界并触发错误,所以我通常会这样做:
for(int i = 0; i < mailbox.size(); i++)
{
if(badNews(mailbox.get(i)))
{
mailbox.remove(i);
i--;
}
}
Run Code Online (Sandbox Code Playgroud)
但遗憾的是BlockingQueue没有按索引获取或删除元素的功能,所以我卡住了.有任何想法吗?
编辑 - 一些澄清:我的目标之一是保持相同的顺序,从头部弹出并将其放回尾部是不好的.此外,虽然没有其他线程会从邮箱中删除邮件,但是它们会添加到邮箱中,因此我不希望处于删除算法的中间,让某人向我发送邮件,然后发生异常.
提前致谢!
我有一个多线程应用程序,其中一个线程向另一个线程发送消息。等待线程轮询消息并做出反应(处理锁)。像这样:
等待线程代码:
while(true)
{
if(helloArrived())
System.out.println("Got hello");
if(byeArrived())
System.out.println("Got bye");
if(stopArrived())
break;
}
Run Code Online (Sandbox Code Playgroud)
我想避免这种 CPU 占用技术,而是使用其他东西。有任何想法吗?
编辑:实际代码如下:
BlockingQueue<Mail> killMeMailbox = new LinkedBlockingQueue<Mail>();
BlockingQueue<Mail> messageMailbox = new LinkedBlockingQueue<Mail>();
public void run()
{
while(true)
{
if(killMeMailbox.size() > 0)
{
break;
}
if(messageMailbox.size() > 0)
{
System.out.println(messageMailbox.poll());
}
}
}
public void receiveMail(Mail mail)
{
//kill
if(mail.from == -1)
{
killMeMailbox.add(0);
}
else
{
//other
try
{
messageMailbox.put(mail);
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
}
Run Code Online (Sandbox Code Playgroud) 在C++ for Linux中,我试图做每微秒/纳秒的事情,目前正在使用下面的nanosleep函数.它可以工作,但是如果代码循环数百万次,这就变得很昂贵.我正在寻找一种高分辨率计时器,它可以实现非常精确的计时(应用程序是音频/视频).有任何想法吗?
struct timespec req = {0};
req.tv_sec = 0;
req.tv_nsec = 1000000000L / value;
for(long i = 0; i < done; i++)
{
printf("Hello world");
nanosleep(&req, (struct timespec *)NULL);
}
Run Code Online (Sandbox Code Playgroud)