什么是线程什么是进程
进程是程序的执行实例,一个进程中包含多个线程。例如:一个程序的运行就是一个进程,线程是一个最小的一个运行单元。
使用多线程是为了提高系统的响应速度。
什么是线程
一个程序里不同的执行路径就是线程
线程实现的方法
thread继承实现、实现runnable接口,java1.5之后实现callbale接口实现带返回值的接口
他们都是调用start 而不是调用run。
调用start是线程调用,调用run是方法调用,执行顺序就是按顺序执行,而调用start是执行线程一个一个执行
线程启动的三种方式:
1、thread,2、runnable,3、Executors。newCatchedThread:在线程池中启用线程
线程的生命周期/运行状态
new :新建状态,还没有调用start方法,线程处于新建状态
runnable:就绪状态,线程调用完start方法之后就进入就绪状态,等待CPU资源,处于就绪状态的线程由java运行时系统的线程调度程序来调度
running 运行状态,就绪的线程获取到CPU执行权之后就进入运行状态,开始执行run方法
blocked:阻塞状态,线程没有执行完,由于某种原因让出CPU执行权,自身进入阻塞状态,
dead:死亡状态,线程执行完或者执行过程中出现异常。
线程之间的协作
wait
当前的线程挂起,进入阻塞状态,notify 或者 notifyAll方法唤醒线程。
方法有wait(long tlimeout)在时间内没有notify或者notifyAll唤醒,会自动唤醒。与wait()一样,wait()与wait(0)一样
wait方法使用必须是在同步的范围内,否则会抛出IllegalMonitorStateException异常。
1.调用wait方法后,线程是会释放对monitor对象的所有权的。
2.一个通过wait方法阻塞的线程,必须同时满足以下两个条件才能被真正执行:
notify/notifyAll
wait是通过对象的monitor实现的,只要在同一个对象上调用notify或者notifyAll,就可以唤醒对应的monitor对象上的等待线程
1.调用wait方法后,线程是会释放对monitor对象的所有权的。
2.一个通过wait方法阻塞的线程,必须同时满足以下两个条件才能被真正执行:
-
线程需要被唤醒(超时唤醒或调用notify/notifyll)。
-
线程唤醒后需要竞争到锁(monitor)。
sleep
sleep是当前线程暂停指定的时间,与wait的区别是wait方法依赖于同步,sleep方法可以直接调用。wait需要释放锁,sleep只是暂时的让出CPU,不会释放锁。
sleep与wait区别
sleep方法是是先暂停,程序顺序进入同步块,当上一个线程执行完之后下一个线程再执行,sleep暂停期间一直持有monitor对象锁,,其他线程是不能进入的
wait是当前线程会释放持有的monitor对象锁,因此,其他的线程可以进入同步方法,线程唤醒之后需要竞争锁,待到锁之后继续执行。
yield
暂停当前线程,一遍其他的线程有机会执行,不能执行时间也不能保证当前线程马上停止,yield只是将Running状态转为Runnable状态。
join
父线程等待子线程执行完之后再执行。就是说将异步执行的线程合并为同步线程执行。也就是说t1线程join t2线程就是等待t2线程执行结束之后t1线程再执行
join只是调用了wait方法,没有对应的notify方法是因为thread的start做了相应的处理,join线程执行完之后会自动唤醒主线程继续往下执行。
run与start区别
r