Java并发编程知识点总结

为什么采用多线程?
之所以采用并发,是因为程序在运行过程中可能会遇到 阻塞,这时候如果是多线程可以保证程序整体还是继续向前的,如果没有阻塞,那么多线程只会增加了上下文切换的代价就没有任何意义了。

Tread定义时需要一个Runnable对象,构造Runnable对象时需要继承Runnable类,并重写run()方法。

线程构造执行方法:
1 构建Runnable对象,直接调用run方法
2 穿件Tread对象,传入Runnable参数,并调用start()方法
3 使用Executor线程执行器,创建线程池

创建线程池的多种方法:
1 ExecutorService exec=Executors.newCachedThreadPool();//创建一个可缓存的线程池
通过exec.execute(Runnable()对象)来添加一个新线程
调用exec的shutdown()方法可以关闭该线程发生器。
2 ExecutorService exec=Executors.newFixedThreadPool(5);//创建一个有限长度的线程池
3ExecutorService exec=Executors.newSingleThreadExecutor();
创建一个单入单出的线程,顺序执行。

线程优先级
Thread可以通过getPriority()获取优先级,并通过setPriority()来设置优先级,优先级有MAX_PRIORITY,MIN_PRIORITY.NORM_PRIORITY三种机制。

调用Thread.yield()可以进行线程让步。

同步机制
java引入synchronized关键字,当任务要执行被synchronized关键字保护的代码片段时,他将检查锁是否可用,然后获取锁,执行代码,释放锁。
所有对象都自动含有单一的锁,它可能有多个synchonized方法,但只要有一个同步方法被使用,那么该对象的锁就会被挂起,这样可以防止多个任务同时访问被编码对象的内存。

Synchronized与Lock的不同
1 用法不同。Synchronized可以加在方法上,也可以加在代码块上,由JVM执行,Lock需要显式的指明开始终结的位置,需要通过代码实现。
2 性能不一样。在竞争不激烈时Synchronized关键字效率较高,在竞争激烈是Lock效率较高。
3 锁机制不一样,Synchronized获取锁都是在代码块中,可以获取多个锁,并逆序释放 锁,且释放是自动的,Lock必须在finally块中手动释放,Synchoronized不会导致死锁,Lock可能会出现死锁。
实现同步的几种方法
1 Synchonized方法,Synchonized块
2 在Synchonized块中,调用wait挂起线程,释放锁,并通过notify告知其他线程
3Lock法

线程的四种状态
新建,就绪,阻塞,死亡

wait()与sleep()
1 sleep不释放锁,wait将释放锁,直到notify()或notifyAll()发生时,任务才会被重新唤醒。
2 wait可能不接受任何参数,一直等下去,知道收到notify()或notifyAll()
3sleep是Thread的一个方法,wait是Object对象的方法
4sleep必须捕获异常,wait不需要。sleep可能会导致死锁。
run()与start()
run是runnable类的一个方法,直接调用run会被当作一个方法,无法实现多线程,start是Thread的方法,是用start能够异步地调用run实现多线程。
死锁
所有线程都在互相等待,最终导致所有线程都没有运行,这样就会产生死锁,避免死锁最简单的方法就是 避免循环等待

你可能感兴趣的:(Thinking,in,java)