Java多线程拾遗

1. 线程的状态

public enum Thread.State {
NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED;
}

2. yield vs wait

yield和sleep一样,调用之后线程转入RUNNABLE状态;而wait调用之后,线程则转入WAIT或TIMED_WAITING状态。
同样,yiled也没有让出锁,只是让出了此时的执行权。别的线程可以执行。
而wait则是让出了锁,只有别的线程调用了锁的notify之后,当前线程才会获得锁继续执行。

3. tryLock

某些锁,如ReentrantLock提供tryLock方法,其含义是如果没有线程持有该锁,则当前线程获得该锁;如果有线程已获得该锁,则当前线程立即返回。

4. Condition的实现

await时,将当前线程加入到等待队列中,并释放当前线程的锁,激活处在等待队列中的下一个线程。

5. Timer的缺陷以及替代品ScheduledThreadPoolExecutor

Timer在执行任务时只创建一个线程,如果该任务执行时间比较长,势必会影响下一个任务的执行。所以现在普遍用ScheduledThreadPoolExecutor来替代。

6. 方法的synchronized属性不可继承

父类方法设置了synchronized属性,子类override了这个方法,如果没有标明synchronized,那么子类的这个方法也不是同步的。

7. 捕获线程异常

针对某个线程:

Thread thread = new Thread(new Runnable(){
            @Override
            public void run()
            {
                int a=1/0;
            }
        });
        thread.setUncaughtExceptionHandler(new UncaughtExceptionHandler(){
            @Override
            public void uncaughtException(Thread t, Throwable e)
            {
                System.out.println("线程:"+t.getName()+" 出现了异常:"+e.getMessage());
            }
        });
        thread.start();

针对所有线程:

 Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler(){
            @Override
            public void uncaughtException(Thread t, Throwable e)
            {
                System.out.println("线程:"+t.getName()+" 出现了异常:"+e.getMessage());
            }
        });

8. Exchanger,线程间交换数据

一个线程调用exchange方法之后进入等待状态,直至另外一个线程也调用了exchange方法。

REF

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容