在SynchronousQueue中执行put操作后线程被挂起

时间:2018-01-26 07:39:13

标签: java multithreading concurrency

这是我的代码

import java.util.concurrent.SynchronousQueue;

public class Mywork {

 public static void main(String args[])
 {
    SynchronousQueue<String> s=new SynchronousQueue<>();
    Producer1 p1 =new Producer1(s);
    Producer2 p2=new Producer2(s);
    new Thread(p1).start();
    new Thread(p2).start();
 }
}

class Producer1 implements Runnable
{
 SynchronousQueue<String> s=null;
 Producer1(SynchronousQueue<String> q)
 {
    this.s=q;
 }

@Override
public void run() {
    // TODO Auto-generated method stub  
    try {
        s.put("Suman");
        System.out.println(s);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }   
 }
}
//
class Producer2 implements Runnable
{
 SynchronousQueue<String> s=null;
 Producer2(SynchronousQueue<String> q)
 {
    this.s=q;
 }
 @Override
 public void run() {
    // TODO Auto-generated method stub

    try {
        s.put("Ghosh");
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }       
 }
}

每当执行put之后我就不能调试它,控件就会从日食中消失

知道为什么会这样吗? fillna

2 个答案:

答案 0 :(得分:0)

来自doc

put方法将阻塞,直到另一个线程从SynchronousQueue检索数据。

答案 1 :(得分:0)

put(E o)

  

将指定的元素添加到此队列, 在必要时等待   另一个接收它的线程。

也就是说,SynchronousQueue在相应的take()调用之前不会返回。并且,您在两个线程中添加元素并导致wait

所以,改变

s.put("Ghosh");

String str = s.take();

将继续执行。