A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 炎星辰 中级黑马   /  2014-5-6 21:35  /  1175 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 炎星辰 于 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;
        }
}

点评

善用论坛搜索功能  发表于 2014-5-6 21:47

7 个回复

倒序浏览
String s1 = "abc"; // s1指向的内存中只有一个对象abc。
String s2 = new String("abc"); // s2指向的内容中有两个对象abc、new 。
回复 使用道具 举报
应该是两个吧,"XYZ"是new创建字符串对象,String s  的s是指向这个字符串的引用对象
回复 使用道具 举报
创建两个对象。一个是new String();一个是"abc";
回复 使用道具 举报
skill20 发表于 2014-5-6 21:44
String s1 = "abc"; // s1指向的内存中只有一个对象abc。
String s2 = new String("abc"); // s2指向的内容 ...

谢谢了
回复 使用道具 举报
String s = new String("xyz");
楼主你好,这一共创建了两个对象:
一个在常量池中
另一个是在堆内存中
回复 使用道具 举报
2               
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马