Java并发编程基础知识片段

Java 5并发包的加入,给Java的并发程序的开发带来了很多的好处,在此列举一些并发编程中应该掌握的一些基础知识片断,这些片断基本都是由一些问题组成,在片段中没有直接写出答案,由于可用来解决这些片段的方法还是很多的,因此只是提到了解决问题可选方案的关键字,如果有需要进一步了解的话,基本上google一下应该就能查出来了,不过就像之前有朋友说的,如果不是经常用的话,其实就算现在知道了也是会忘记的,这很正常,:),不过我更认为那是因为知其然而不知其所以然造成的,很多东西如果知道原理的话,基本上还是可以记得很长一段时间的。
片断一
在main中启动两个线程,例如:
    Thread a=new Thread(){
        public void run(){
             System.out.println("Call A");
             try{
                  Thread.sleep(1000);
             }
             catch(Exception e){
                 e.printStackTrace();
             }
        }
    };
    Thread b=new Thread(){
        public void run(){
             try{
                  Thread.sleep(500);
             }
             catch(Exception e){
                 e.printStackTrace();
             }
             System.out.println("Call B");
        }
    };   
    a.start();
    b.start();   
    System.out.println("execute here");
在这样的方式下,执行时会出现什么样的效果;
怎么样才能保证字符串的打印顺序是:"Call B"-->"Call A"-->"execute here"呢?(提示:join、wait/notify、Semphore、Lock等)
在做到了上面打印顺序控制后,怎么样才能做到如果线程b执行了100毫秒还没执行完的话则直接继续线程a的执行呢?(提示:ExecutorServices、Future)
片段二
也是个控制顺序的问题,假设有如下一段代码:
for(int i=0;i<10;i++){
    Thread thread=new Thread(){
        public void run(){
            ...
        }
    };
    thread.setName("Thread-"+i);
    thread.start();
}
System.out.println("All Executed");
需要做到所有线程同时运行,而不是按照for的顺序一个一个启动,并且要求All Executed需要在所有线程都执行完毕后才打印,有什么办法做到呢?(提示:CountDownLatch等)
片段三
Map<String,Object> datas=new ConcurrentHashMap<String,Object>();
public Object get(String keyName){
    Object data=null;
    if(!datas.containsKey(keyName)){
         data=createData(keyName);
         datas.put(keyName,data);
    }
    else{
         data=datas.get(keyName;)
    }
    return data;
}
上面这段代码在并发时会出什么问题呢,为什么?
如果有问题的话,应该怎么去解决呢?(提示:Synchronized、Lock、FutureTask等)
片段四
ThreadPoolExecutor executor=new ThreadPoolExecutor(10,100,60L,TimeUnit.SECONDS,new LinkedBlockingQueue<Runnable>(20),new ThreadPoolExecutor.AbortPolicy());
一个这样的线程池,当并发请求数为15时会是怎么个状况?(池的使用状况,例如活动线程数、队列中的数等)
当并发请求数为100的时候是什么状况?
当并发请求数为200的时候是什么状况?
当30秒内不再有请求时会怎么样?
当2分钟内没有请求时会怎么样?
如果换成以下方式初始化池又会怎么样呢:
ThreadPoolExecutor executor=new ThreadPoolExecutor(10,150,20L,TimeUnit.SECONDS,new SynchronousQueue<Runnable>(),new ThreadPoolExecutor.AbortPolicy());
片段五
怎么查看jvm中线程的执行状况,线程的状态有哪几种,分别表示什么含义?
ThreadFactory有什么用?
如果要捕捉线程中抛出的异常,可以怎么做呢?
如果TimerTask抛出运行时异常会不会影响到同一个Timer中其他的TimerTask的执行呢,SchedularThreadPoolExecutor和Timer有什么不同?
片段六
常见的一个例子:
private int count;
public synchronized int getNext(){
    return count++;
}
在JDK5有什么别的方法来进行实现吗?
像JDK5中的AtomicInteger的incrementAndGet是怎么实现的呢?
如果这个count要按线程来独立管理,即每个线程有自己的一个count,要怎么做呢?

posted on 2008-06-20 01:29 BlueDavy 阅读(7921) 评论(4)  编辑  收藏 所属分类: Java

评论

# re: Java并发编程基础知识片段 2008-06-25 14:36 邓芝

c、c++、Java、C#等非并行程序语言,对于多线程[甚至多进程]环境下的一些基本概念一直都没有改变过。同步、信号量、同步锁、互斥锁、共享[内存、对象、资源]等等,不同语言的实现机制完全不同,随着多核CPU的出现实现方式也有变化(通常底层类库的实现者需要考虑这些问题)。具体应该使用哪个概念,那个技术,需要依据场景的不同而进行针对性的选择。
非常感谢BlueDavy,总是提出好些关键话题,让我也忍不住要写点东西,把自己的一些经验分享一下。:)  回复  更多评论   

# re: Java并发编程基础知识片段 2008-06-25 17:32 BlueDavy

@邓芝
好事呀,就应该把你的经验也给大家多分享分享的。  回复  更多评论   

# re: Java并发编程基础知识片段 2008-07-09 20:37 网站建设

只能说session用的时候要非常注意吧,  回复  更多评论   

# re: Java并发编程基础知识片段[未登录] 2008-08-12 11:25 kruce

片断3你想锁住整个Map对象么?
貌似不可取
Callable, Future, FutureTask, putIfAbsent  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 

公告

 









feedsky
抓虾
google reader
鲜果

导航

<2008年6月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

统计

随笔分类

随笔档案

文章档案

Blogger's

搜索

最新评论

阅读排行榜

评论排行榜