小编Jos*_*osh的帖子

在Java中,BlockingQueue是否完全是线程安全的

我知道文档说该对象是线程安全的,但这是否意味着所有方法对它的所有访问都是线程安全的?因此,如果我一次从多个线程调用put()并在同一个实例上调用(),那么会发生什么不好的事情吗?

我问,因为这个答案让我第二次猜测:https: //stackoverflow.com/a/22006181/4164238

java

20
推荐指数
1
解决办法
2万
查看次数

如何使用循环从Java中删除队列中的元素

我有这样的数据结构:

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没有按索引获取或删除元素的功能,所以我卡住了.有任何想法吗?

编辑 - 一些澄清:我的目标之一是保持相同的顺序,从头部弹出并将其放回尾部是不好的.此外,虽然没有其他线程会从邮箱中删除邮件,但是它们会添加到邮箱中,因此我不希望处于删除算法的中间,让某人向我发送邮件,然后发生异常.

提前致谢!

java loops blockingqueue

8
推荐指数
1
解决办法
2万
查看次数

如何避免在 Java 中忙于旋转

我有一个多线程应用程序,其中一个线程向另一个线程发送消息。等待线程轮询消息并做出反应(处理锁)。像这样:

等待线程代码:

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)

java multithreading mutex

6
推荐指数
1
解决办法
4300
查看次数

寻找高分辨率计时器

在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)

c++ linux timer

5
推荐指数
1
解决办法
663
查看次数

标签 统计

java ×3

blockingqueue ×1

c++ ×1

linux ×1

loops ×1

multithreading ×1

mutex ×1

timer ×1