多线程的创建:
1.继承Thread
编写继承Thread的类->重写run方法->new该类的对象->该对象.start
2.实现Runnable接口
编写实现Runnable接口的类->重写run方法->new该类的对象->用该对象实例化Thread对象->Thread对象.start
3.实现Callable接口
编写实现Callable接口的类->重写call方法->new该类的对象->用该对象实例化FutureTask的对象->用该FutureTask对象实例化Thread对象->Thread对象.start
4.使用线程池
Executor.new->service.excute/submit->.shutdown (管理线程池用ThreadPoolExecutor)
处理线程安全的方法:
1.同步代码块
synchronized(锁){代码块} (锁可以为任意对象,但要保证锁唯一)
2.同步方法
用synchronized修饰方法 (不加static的同步监视器是this,加了static的同步监视器是当前类本身)
3.使用Lock
实例化ReentrantLock->用try,finally包裹代码块->用.lock与.unlock来灵活控制锁的开关
注意点:
1.存在共享数据时才会出现线程安全问题
2.无论哪种线程创建方式都要保证锁唯一,锁即同步监视器
3.线程通信用wait、notify、nitifyAll,wait会释放锁,sleep与yield不会释放锁;sleep是在Thread里,wait是在Object里
4.重写Runnable的方式克服了单继承的局限性;重写Callable的方式添加了返回值、且有泛型、可抛异常;线程池的方式克服了线程反复的创建与销毁所花费的时间,且便于管理
5.Runnable是始祖,所有这些的底层都是重写Runnable接口
Java多线程
最新推荐文章于 2024-07-15 22:27:18 发布