线程的创建:程序:是指含有指令和数据的文件,被存储在磁盘或其他的数据设备中,也就是说程序是静态的代码;
进程:是程序的一次执行过程,是代码在数据集合上的一次运行活动,是系统资源分配和调度的基本单位;
线程:是进程的一个执行路径,一个进程中至少有一个线程,进程中的多个线程共享进程的资源;
线程的生命周期:
- 继承Thread创建线程:
扩展 Thread类,
重写父类的run()方法,规定线程的具体 *** 作
创建扩展类的对象,调用start()启动线程
- 实现Runnable接口创建线程:
- 创建实现Runnable接口类,实现run()方法
使用实现类的对象作为目标对象,创建Thread对象
调用start()启动线程
- 使用Callable和Future创建线程(了解)
创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,且该call()方法有返回值,再创建Callable实现类的对象
使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值
使用FutureTask对象作为Thread对象的目标对象创建并启动新线程
调用FutureTask对象的get()方法来获得子线程执行结束后的返回值
通过实现接口和继承类两种方式创建对象的比较:
采用实现 Runnable、Callable 接口的方式创建多线程时,线程类只是实现了 Runnable 接口或 Callable 接口,还可以继承其他类。还便于目标对象的共享
使用继承 Thread 类的方式创建多线程时,编写简单,如果需要访问当前线程,则无需使用 Thread.currentThread() 方法,直接使用 this 即可获得当前线程。不能再继承其他类
线程的同步:这个图讲的很详细:
- yield():让出一次执行机会,使线程从运行状态转到可运行状态
- join():等待这个线程结束;也就是,t.join()方法阻塞调用此方法的线程,直到线程t完成,此线程再继续;通常用于在main()主线程内,等待其它线程完成再结束main()主线程
- sleep方法:
volatile关键字:
简单,保证数据的可见性。就是一个线程在对主内存的某一份数据进行更改时,改完之后会立刻刷新到主内存。并且会强制让缓存了该变量的线程中的数据清空,必须从主内存重新读取最新数据。
synchronized关键字:对对象自动上锁
同步普通方法(实例方法)上锁,锁是当前实例对象 ,进入方法前要获得当前实例的锁,方法执行完释放。
同步静态方法,锁是当前类的class对象 ,进入方法前前要获得当前类对象的锁,方法执行完释放。
同步代码块,要指定锁的对象,是可以是实例对象,也可以是类对象,进入同步代码块前要获得给定对象的锁,代码块执行完释放
-
Lock接口和 ReentrantLock类:需要 显示的获得、释放锁。实现同步更灵活
常用方法:lock()获取锁;及unLock()释放锁
wait():的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,当前线程被唤醒(进入“就绪状态”)
notify()和notifyAll()的作用,则是唤醒当前对象上的等待线程;notify()是唤醒单个线程,而notifyAll()是唤醒所有的线程
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)