黑马程序员技术交流社区

标题: SynchronousQueue阻塞队列问题 [打印本页]

作者: 炎星辰    时间: 2014-5-6 21:35
标题: SynchronousQueue阻塞队列问题
本帖最后由 炎星辰 于 2014-7-19 16:00 编辑

public static void main(String[] args) {
                final SynchronousQueue<String> m = new SynchronousQueue<String>();
                //特别注意SynchronousQueue 一定要先取数据 m.take() 在存m.put(input);才能取到数据 不然就死锁了!!!
                //创建一个缓存线程池        线程池中的线程数根据任务多少自动增删 动态变化
                ExecutorService threadPool = Executors.newCachedThreadPool();
                final Semaphore sem = new Semaphore(1);//信号灯
                for (int i = 0; i < 10; i++) {
                        threadPool.execute(new Runnable() {
                                @Override
                                public void run() {
                                        try {
                                                sem.acquire();
                                                String input = m.take();
                                                String output = TestDo.doSome(input);
                                                System.out.println(Thread.currentThread().getName()
                                                                + ":" + output);
                                                // custom.unlock();
                                                sem.release();
                                        } catch (InterruptedException e) {


                                                e.printStackTrace();
                                        }
                                }
                        });
                }//这段代码如果放在绿色的下面 会出现死锁

                System.out.println("begin:" + (System.currentTimeMillis() / 1000));
                for (int i = 0; i < 10; i++) { // 这行不能改动
                        String input = i + ""; // 这行不能改动
                        try {
                                m.put(input);
                        } catch (InterruptedException e) {
                                e.printStackTrace();
                        }
                }

        }
}

// 不能改动此TestDo类
class TestDo {
        public static String doSome(String input) {

                try {
                        Thread.sleep(1000);
                } catch (InterruptedException e) {
                        e.printStackTrace();
                }
                String output = input + ":" + (System.currentTimeMillis() / 1000);
                return output;
        }
}

作者: skill20    时间: 2014-5-6 21:44
String s1 = "abc"; // s1指向的内存中只有一个对象abc。
String s2 = new String("abc"); // s2指向的内容中有两个对象abc、new 。
作者: 大漠孤烟    时间: 2014-5-6 21:49
应该是两个吧,"XYZ"是new创建字符串对象,String s  的s是指向这个字符串的引用对象
作者: 大恶魔先森~    时间: 2014-5-6 21:49
创建两个对象。一个是new String();一个是"abc";
作者: 炎星辰    时间: 2014-5-6 23:08
skill20 发表于 2014-5-6 21:44
String s1 = "abc"; // s1指向的内存中只有一个对象abc。
String s2 = new String("abc"); // s2指向的内容 ...

谢谢了

作者: 赵京    时间: 2014-5-6 23:46
String s = new String("xyz");
楼主你好,这一共创建了两个对象:
一个在常量池中
另一个是在堆内存中
作者: ς高眼光の目标    时间: 2014-5-7 03:11
2               




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2