能一直看到这里基本的编码能力肯定是有的了,所以我这里就很少展开了.基本就更像是思维导图,如果对当前得方法有兴趣,还得自己去查查看.
一个类继承Thread类,并实现run方法,实例化这个类并调用start()方法时,就会创建一个线程来运行,要想打断正在运行的现成,线程里必须存在Thread.sleep()的调用,这个调用会被InterruptedException打断,捕获这个异常可以退出这个线程.实现的这个类的构造方法可以传入一些参数.
但是Therad是个类,单独为一个小任务开一个类不划算,所以可以用Runnable,他是一个接口.可以使用一些仍在寿命周期的变量,不能传入参数.
new Thread(new Runnable() {
@Override
public void run() {
// 干一些活!
}
}).start(); // 创建并启动线程
如果还要涉及返回值要用Callable,使用FutuerTask创建任务,并在合适的时候使用future.run运行,再在合适的时候用future.get获取返回值.
除了立即运行还有延迟运行和周期性运行,可以继承TimerTask来实现,继承后有schedule方法,可以指定多久后执行,或者周期性执行.
既然有了多线程就等于支持一定程度的并发,主要的同步控制有以下方法.
- 关键字 synchronized - 可以是等待某个变量,也可以是等待阻塞同类.
- 锁机制 ReentrantLock - 可细分为读写锁,锁上就独占.
- 信号量 Semaphore - 信号量可以提供可控流量的同步.
- 线程池 ExecutorService - 可控容量和规模的并发度控制.
- 定时调度线程池 ScheduledExecutorService - 在线程池基础上加入了类TimerTask功能.
- 分治框架 Fork/Join - 通过Pool进行任务的切割运行和合并.
多线程本身难度不大,主要还是看应用.