您的位置:首页 > 编程语言 > Java开发

Java并发编程基础知识片段

2008-10-14 09:28 531 查看
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,要怎么做呢?

转自 http://www.blogjava.net/BlueDavy/archive/2008/06/20/209297.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: