多线程的简单认识(二)

来源:互联网 发布:java在线 编辑:程序博客网 时间:2024/04/30 07:41

接文章一

多线程的容器--线程池

线程池的目的:减少创建和销毁线程所带来的时间和性能的开销。

线程池的结构:线程池分为4个模块

1,线程池管理器,主要用来创建线程并管理线程池,包括创建和销毁线程池。

2,工作线程,线程池中的线程,有任务时处理,没有任务时空闲等待。

3,任务接口,每个任务要执行的接口,供工程线程调度任务的执行。

4,任务队列,当当前线程池没有空闲的线程时,把新任务放到任务队列中等待线程来处理。

线程池的创建方式:

1,Executors.newFixedThreadPool(int);创建固定个数的线程池

2,Executors.newCachedThreadPool()  创建缓存的线程池,当任务数大于线程的数时,线程池可以智能的添加新线程;当任务小于线程的数时,线程池就会收拾某个时间段没有工作的线程。线程池的大小依赖与jvm所能创建的线程大小。

3,Executors.newSingleThreadExecutor() 创建单个线程的线程池,不存在并发,只有当前线程发生异常退出,才会创建新的线程来替代当前线程继续执行任务。

4,Executors.newScheduledThreadPool(int) 创建N个可以定时或者周期性的执行任务的线程池。


多线程的简单例子  生产者消费者(api文档的例子,比较经典,直接拿来用)

class Producer implements Runnable { private final BlockingQueue queue; Producer(BlockingQueue q) { queue = q; } public void run() { try { while(true) { queue.put(produce()); } } catch (InterruptedException ex) { ... handle ...} } Object produce() { ... } } class Consumer implements Runnable { private final BlockingQueue queue; Consumer(BlockingQueue q) { queue = q; } public void run() { try { while(true) { consume(queue.take()); } } catch (InterruptedException ex) { ... handle ...} } void consume(Object x) { ... } } class Setup { void main() { BlockingQueue q = new SomeQueueImplementation(); Producer p = new Producer(q); Consumer c1 = new Consumer(q); Consumer c2 = new Consumer(q); new Thread(p).start(); new Thread(c1).start(); new Thread(c2).start(); } }

线程的种类:用户线程和守护线程(又叫 daemon 线程)
daemon线程是为了给其他线程的运行提供服务,比如GC线程。
用户线程在创建时,设置 thread.setDaemon(true) 就ok了,一定要走线程启动前设置,否则会抛异常。
当用户线程都退出时,守护线程也会自动退出,守护线程创建出来的线程也是守护线程。
先到这,如果再想到其他的,再补充。
水平有限,有问题可以留言指出,再纠正。
未完待续


0 0
原创粉丝点击