Java并发摘要(一)

来源:互联网 发布:php图像乱码 编辑:程序博客网 时间:2024/05/18 03:12

Thinking in Java中并发这一章节的笔记摘要,温习Java多线程编程。


并发编程使我们可以将程序划分为多个分离的任务。Java中使用多线程机制,一个线程就是在进程中的一个单一的顺序控制流,其底层机制是切分CPU时间。


定义任务

线程驱动任务,Java中用Runnable接口来提供描述任务的方式——实现Runnable接口并重写run()方法。


Thread.yield()的调用是对线程调度器的建议,建议可以将CPU转移给其他具有相同优先级的线程,但这完全是选择性的。


我们可以在main()中直接调用该任务,即new一个任务对象并执行run()方法,这样任务就附在了分配给main()的那个线程。


要实现线程行为,必须显示地将一个任务附着到线程上。


Thread类

将Runnable对象附着到线程上的一般方法是把它交给Thread构造器。

即Thread t=new Thread(new Runnable());

t.start();


当同时运行多个线程时,两次结果可能不同,因为线程调度机制是非确定的。


Executor

Java SE5的java.util.concurrent包中的Executor可以管理Thread对象,而无需显式地管理线程的生命周期,从而简化并发编程。

ExecutorService exec=Executors.newCachedThreadPool();

exec.execute(new Runnable());

exec.shutdown();

其中CachedThreadPool()在程序执行过程中通常会创建与所需数量相同的线程,然后再它回收旧线程时停止创建新线程,因此它是合理的Executor的首选。

FixedThreadPool()用于创建线程数为固定数量的情况。


从任务中产生返回值


如果希望当任务完成时能够返回一个值,那么可以实现Callable接口而不是Runnable接口。在Java SE5中引入的Callable是一种具有类型参数的泛型,它的类型参数表示的是从方法call()中返回的值,并且必须使用ExecutorService.submit()方法调用它。

如在TaskWithResult implements Callable<String>中call方法定义返回的是String对象

在主线程中执行Future<String> fs=exec.submit(new TaskWithResult() and do sth.);

再用fs.get()得到Task的结果。


休眠

影响任务行为的一种简单方法时调用sleep(),这将使任务中止执行给定的时间。但是如果要控制任务执行的顺序,最好的方法时使用同步控制,而不是sleep(),因为它依赖于底层的线程机制,这种机制在不同的操作系统之间是有差异的。


优先级

优先级是在run()的开头部分用Thread.currentThread().setPiority(priority);设定的。


加入一个线程

一个线程可以在其他线程之上调用join()方法,其效果是等待一段时间直到第二个线程结束才继续执行。如果某个线程在另一个线程t上调用t.join(),此线程将被挂起,直到目标线程t结束才恢复。


0 0
原创粉丝点击