`
free_flurry
  • 浏览: 3620 次
  • 性别: Icon_minigender_1
  • 来自: 福州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

看JAVA编程思想时候感觉作者有句话不对(关于并发)

阅读更多
中文第四版的哦(p657倒数第十行)“然后在它回收旧线程时停止创建新线程”。
这个它指的是CachedThreadPool,我一开始是深信不疑的,认为CachedThreadPool如果一个线程死亡了,那它就不会再创建新的线程了。后来看到一个大牛说“会”。于是自己做了实验:
package test;
import java.util.*;
import java.util.concurrent.*;
import java.util.concurrent.locks.*;
import java.io.*;
public   class  Test1 implements Callable<Thread>{
	static ThreadLocal<Integer> t=new ThreadLocal<Integer>(){
		@Override
		protected synchronized Integer initialValue(){
			return new Integer(0);
		}
	};
	static int count=0;
	final int id=count++;
	public Test1(){
		System.out.println("Constructor:"+id);
	}
	static class Test2 implements Runnable{
	public void run(){
		System.out.println(t.get()+" o");
	}
	}
	public Thread call(){
		t.set(id);
		System.out.println(t.get());
		return Thread.currentThread();
		
	}
	public static void main(String[] args){
		ExecutorService exec=Executors.newCachedThreadPool();
		for (int i=0;i<4;i++)
			exec.submit(new Test1());
		Future<Thread> f=exec.submit(new Test1());

		try{
			((Thread)f.get()).join();}//等待线程死亡
			catch (Exception e){
			
			}
		
		for (int i=0;i<5;i++)
			exec.execute(new Test2());
		exec.shutdownNow();
	
	}
}




结果如下:
Constructor:0
Constructor:1
Constructor:2
Constructor:3
Constructor:4
1
3
0
2
4
0 o
0 o
0 o
0 o
0 o


我是用ThreadLocal来确定一个线程的存活的(因为ExecutorService没有提供关于线程池里线程信息的方法只好这么做了,如果大家有什么其他方法的话也不吝赐教)这里虽然只是join了一个线程,但是从结果看其他线程也都死亡了。ThreadLocal是与线程相关的变量,线程换了一个任务以后也仍然保持原值。不信的话,可以把join方法那句去掉。

0
0
分享到:
评论
1 楼 ahujyy 2011-11-05  
书后面的我没看过,不过觉得“然后在它回收旧线程时停止创建新线程”是说主线程回收线程的时候是不会创建线程的,并不是说以后就不会增加线程了,突然大量的task过来,老线程都在干活,还得开新线程的,只要指向有效,还是会起线程跑的。那句话里"时候"可能是指此时没有新任务过来,ThreadPoolExecutor的getTask()方法中的workQueue(实现类SynchronousQueue).pool(keepAliveTime, TimeUnit.NANOSECONDS)超时,null被返回,老线程死去回收,如果有新任务来,恰好老线程pool,这时候就老线程就会拿到新任务接着跑,++completedTasks。这点把你上面写的代码跑下也能证实。
final int id=count++改成 final int id=++count;new 10个test1,注释掉等待第11个线程执行完,结果:
Constructor:1
Constructor:2
Constructor:3
Constructor:4
Constructor:5
Constructor:6
1
5
2
4
3
6
Constructor:7
Constructor:8
7
8
Constructor:9
Constructor:10
9
10
Constructor:11
11
11 o
3 o
2 o
4 o
9 o

老线程都用上了,这也就是它的优势吧,但是这个pool会在所有线程都没事干的时候死光光,如果主线程不轮询的话,主线程结束,所以子线程也已经结束了,程序就停止了。fixed的就不会这样了。我猜大部分应该都会轮询吧。

相关推荐

    java并发编程2

    Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。以下是对标题和描述中所提及的几个知识点的详细解释: 1. **线程与并发** - **线程*...

    Java 并发编程实战.pdf

    《Java并发编程实战》这本书是关于Java语言中并发编程技术的经典著作。它详细介绍了如何在Java环境中有效地实现多线程程序和并发控制机制。在Java平台上,由于其本身提供了强大的并发编程支持,因此,掌握并发编程...

    java并发编程实战中文加英文版加源码

    直接就放在书上,你丫有没有良知,书籍是什么,是希望,是神圣的,你们这些译者简直就是在犯罪 ,不过要是英文功底不好,还是建议买本看吧,谁让你英文水平不如他们呢 《JAVA并发编程实践》随着多核处理器的普及,...

    java并发编程书籍

    Java并发编程是软件开发中的一个关键领域,尤其是在大型企业级应用和分布式系统中。通过学习相关的书籍,开发者可以深入...购买并阅读相关的专业书籍,如《Java并发编程实战》等,将有助于你系统地掌握这一领域的知识。

    java并发编程艺术

    《Java并发编程艺术》这本书深入探讨了Java平台上的并发编程技术。并发编程是现代多核处理器环境下提升软件性能的关键手段,而Java语言提供了丰富的工具和API来支持这一领域。本书旨在帮助开发者理解和掌握如何在...

    java并发编程实践pdf笔记

    Java并发编程实践是Java开发中不可或缺的一个领域,它涉及到如何高效、正确地处理多线程环境中的任务。这本书的读书笔记涵盖了多个关键知识点,旨在帮助读者深入理解Java并发编程的核心概念。 1. **线程和进程的...

    JAVA并发编程艺术 高清pdf

    JAVA并发编程艺术 高清pdf : 1.并发变成的挑战 2. java并发机制的底层实现原理 3. java 内存模型 4. java并发编程基础 5.java中的锁。。。。。。。

    《java 并发编程实战高清PDF版》

    总之,《Java并发编程实战》是一本全面介绍Java并发编程的书籍,适合有一定Java基础并希望提升并发编程能力的开发者阅读。通过学习,你可以掌握解决并发问题的策略和技巧,编写出更加健壮和高效的多线程应用。

    java并发编程

    Java并发编程是Java开发者必须掌握的关键技能之一,它涉及到如何在多线程环境中高效、安全地执行程序。并发编程能够充分利用多核处理器的计算能力,提高应用程序的响应速度和整体性能。《Java编程并发实战》这本书是...

    java 编程思想中文版 及 习题

    《Java编程思想》是Java开发领域的一本经典著作,作者是Bruce Eckel。这本书深入浅出地介绍了Java语言的核心概念和技术,对初学者和有经验的开发者都极具价值。书中的内容涵盖了Java语言的各个方面,从基本语法到...

    Java 并发核心编程

    ### Java 并发核心编程知识点解析 #### 一、Java并发概述 自Java诞生之初,其设计者就赋予了该语言强大的并发处理能力。Java语言内置了对线程和锁的支持,这使得开发者能够轻松地编写多线程应用程序。本文旨在帮助...

    java并发编程与实践

    在Java编程领域,并发编程是一项核心技能,尤其是在大型系统或分布式应用中,高效地处理多线程和并发操作是至关重要的。"Java并发编程与实践"文档深入剖析了这一主题,旨在帮助开发者理解和掌握如何在Java环境中有效...

    Java并发编程书籍高清版

    首先,我们来看《Java并发编程实践》(Java Concurrency in Practice)这本书,作者Brian Goetz等。这本书是Java并发领域的经典之作,深入浅出地讲解了Java平台上的并发编程原理和最佳实践。书中涵盖了线程安全、...

    java并发编程内部分享PPT

    Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。这份“java并发编程内部分享PPT”显然是一个深入探讨这一主题的资料,旨在帮助开发者...

    java并发编程实战(英文版)

    在《Java并发编程实战》这本书中,作者深入浅出地介绍了Java 5.0和Java 6中新增的并发特性。这些特性旨在帮助开发者更高效、安全地编写多线程程序。书中通过实例解释了诸如`ExecutorService`、`Future`、`Callable`...

    JAVA并发编程实践.pdf

    《JAVA并发编程实践》并不仅仅提供并发API的清单及其机制,还提供了设计原则、模式和思想模型,使我们能够更好地构建正确的、性能良好的并发程序。《JAVA并发编程实践》适合于具有一定Java编程经验的程序员、希望...

Global site tag (gtag.js) - Google Analytics