Java 并发编程知识点(一)

来源:互联网 发布:吾生有涯,而知无涯全文 编辑:程序博客网 时间:2024/05/21 10:51

1、Thread.yield()含义:该方法的调用是对线程调度器(Java线程机制的一部分,可以将CPU从一个线程转移到另一个线程)的一种建议(只是一个暗示,没有任何机制保证他会被采纳,当调用yield()的时候,你也是在建议具有相同优先级的其他线程可以运行),它在声明:我已经执行完生命周期中最重要的部分,此刻正是切换给其他任务执行一段时间的大好时机。 

2、Thread的start()方法:调用该方法将为线程执行必要的初始化操作,并且该方法调用之后会迅速返回。

3、Executor是Java(java.util.concurrent包下)为我们提供的用于管理Thread对象,简化并发编程的执行器。

        1)通过Executors可以创建四种不同类型的线程池 -- FixedThreadPool、SingleThreadPool、CacheThreadPool(首选)、scheduledThreadPool,这四种类型的线程池都是基于ThreadPoolExecutor实现的。

        2)对shutdown()方法的调用可以防止新任务被提交给这个Executor,当前线程将继续执行在shutdown()被调用之前提交的所有的任务,这个程序将在Executor中的所有任务完成之后尽快退出。

4、Callable接口:如果你希望任务在完成时能够返回一个值,那么可以实现Callable接口而不是Runnable接口。Callable是一个具有类型参数的泛型,它的类型参数表示的是从call方法中返回的值,并且必须使用ExecutorService.submit()方法调用它,submit()方法会产生一个Future对象,通过该对象,可以调用isDone()、get()等方法。注意:get将阻塞,直至结果准备就绪。

5、对sleep()的调用可以抛出InterruptException异常,并且因为异常不能跨线程传播,所以你必须在本地处理(在run方法中try catch )所有在任务内部产生的异常。(可以查看http://blog.csdn.net/json_it/article/details/71329875).

6、在绝大多数时间里,所有线程都应该以默认的优先级运行。试图操纵线程优先级通常是一种错误。调度器总是倾向于执行优先级高的线程,这并不意味着优先级低的线程得不到执行,只是被执行的频率比较低而已。尽管JDK有10个优先级,但是它与大多数操作系统都不能映射的很好。比如Windows有七个优先级且不是固定的,所以这种映射关系是不能固定的。唯一可移植的方法是当调整优先级的时候,只使用MAX_PRIORITY、NORMAL_PRIORITY、MIN_PRIORITY三种级别。

7、守护线程(daemon)是指在程序运行的时候在后台提供的一种通用服务的线程,并且这种线程并不属于程序中不可或缺的部分。因此,当所有的非后台线程结束时,程序也就终止了,同时会杀死进程中的所有后台(守护)线程。反过来,只要有任何非后台线程还在运行,程序就不会终止。

       必须在线程启动之前调用setDeamon()方法,才能设置线程为守护线程。比如:

       Thread t   =  new Thread(new RunbableImpl());

       t.setDeamon(true);

       t.start();

      可以通过isDeamon()方法来确定是否是一个守护线程,如果是,那么该守护线程创建的任何线程将被自动设置成守护线程。

      你应该意识到守护线程在不执行finally子句的情况下就会终止其run()方法,比如:

        class ADeamon implements Runnable{

public void run(){

try{

print("starting ADeamon");

TimeUnit.SECONDS.sleep(1);

}catch(Exception e){

print("exiting via interruptedException");

}finally{

print("this is always run??");

}

}

}

public static void main(String[] args){

 Thread t = new Thread(new  ADeamon ());

t.setDeamon(true);

t.start();

}

--->starting ADeamon

当运行这个程序的时候,你不会看到finally子句被执行,为啥呢?

看一下上述2的原因,start()方法调用之后,此时没有任何非守护线程,则此时所有的守护线程会"突然"终止。因此一旦main()退出,JVM就会立即关闭所有的后台线程。

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

       对join方法的调用可以被中断,做法是在调用线程上调用interrupt()方法,这时需要用到try-catch子句。

注意:Java 类库包含的CyclicBarrier比最初的线程类库中的join()更加合适。

9、对一个线程调用interrupt()方法时,将给该线程设置一个标志,表明该线程已经被中断了。然而,异常在被捕获的时候将清理这个标志。比如:

try{

sleep(1500);

}catch(InterruptException e){

print("isInterrupted:"+isInterrupted());

}

-->isInterrupted:false

所以在异常捕获的时候,这个标志总是false;

0 0
原创粉丝点击