一、什么是线程,什么是进程
进程
进程是指在系统中正在运行的一个应用程序,程序一旦运行就是进程。
进程是系统进行资源分配的独立实体, 且每个进程拥有独立的地址空间。
一个进程可以拥有多个线程,每个线程使用其所属进程的栈空间。
线程
线程是进程的一个实体,是进程的一条执行路径。
线程是CPU独立运行和独立调度的基本单位。
二、线程怎么创建
1、继承Thread类
2、实现Runnable接口
3、实现Callable接口
4、线程池方式
略,后面会写
线程的生命周期
线程中断
1.Java中线程中断是一种协作机制
2.通过中断并不能直接终止线程的运行
3.需要被中断的线程自己处理中断
线程中断的概念
1.每个线程有一个boolean类型的标志位,代表线程是否中断
2.线程1想中断线程2,线程1只需要设置线程2的中断标志位等于true
3.线程2在合适的时候处理该中断请求。甚至线程2可以选择不处理中断请求。
线程中断相关方法
1.public static boolean interrupted()
.测试当前线程是否已经中断。 线程的中断状态由该方法清除。
如果连续两次调用该方法,则第二次调用将返回false。
在第一次调用已清除了其中断状态之后,且第二次调用检验完中断状态前,
当前线程再次中断的情况除外
2. public boolean isInterrupted()
测试线程是否已经中断。线程的中断状态不受该方法的影响。
3. public void interrupt()
将调用该方法的对象所表示的线程标记一个停止标记,并不是真的停止该线程。
interrupt()方法是唯一能将中断状态设置为true的方法 。
静态方法interrupted()会将当前线程的中断状态清除。
线程优先级
1.在Java中,线程优先级的范围是1 ~10,默认的优先级是5。
2.“高优先级线程”会优先于“低优先级线程”执行。
继承性
线程A启动线程B,线程A和B具有相同的优先级
随机性
CPU尽量将执行的资源让给优先级高的线程用,但是不一定是优先级较大的线程先执行完
守护线程
1.用户线程 执行用户级的任务
2.守护线程一后台线程, 一般用于执行后台任务
3. isDaemon()方法来区分:如果返回false,则说明该线程是“用户线程”;否则就是“守护线程
4. Java虚拟机在“用户线程”都结束后会后退出。
守护线程的使用
1.守护线程并非只有虚拟机内部特有的
2.Thread.setDaemon()方法可以设置守护线程
3.如果想设置线程有守护线程,必须在线程运行前设置,否则会抛llegalThreadStateException异常
4.守护线程创建的子线程也是守护线程
线程常用的方法
sleep()方法
1.sleep()方法的作用是让当前线程暂停指定的时间(毫秒)
2.sleep()方法只是暂时让出CPU的执行权,并不释放锁
3.由于对象锁没有被释放,其他线程仍然无法访问这个对象
4. sleep()方法不需要在同步的代码块中执行
5. sleep()可以通过interrupt()方法打断线程的暂停状态
6. sleep()只是线程的操作,用于短时间暂停线程,不涉及线程间通信
7. sleep()是Thread类的方法
wait()方法
1.wailt()/notify()方法通常成对出现
2.wait()/notify()方法需要获取对象锁方可调用
3.wait()notify()方法要写在同步代码块或者同步方法内
4.一旦调用wait()方法,其他线程将可以访问这个对象
5.当一个线程执行到wait()方法时,它就进入到一个和该对象相关的等待池中,同时失去了对象的机锁,可以允许其它的线程执行一些同步操作。
6. wait()可以通过interrupt()方法打断线程的暂停状态,从而使线程立刻抛出中断异常
7.重获对象锁:
a)设置wait()方法的参数,如wait(1000)表明借出去1秒钟之后,自动收回锁
b)让借锁的线程通知(notify) 当前线程,借锁线程用完了当前线程马上就收回来
7. wait()/notify()是Object类的方法
notify()/notifyAlI()
1.notify()唤醒在此对象监视器({对象锁)上等待的单 个线程
2.当它被一个notify()方法唤醒时,等待池中的线程就被放到了锁池中
3.该线程将等待从锁池中获得锁,然后回到wait()前的现场
4. notifyll()唤醒在此对象监视器(对象锁}上等待的所有线程
5.唤醒的线程的顺序LIFO
5. wait()ntify()notifAll()涉及线程间的通信
yield()方法
1.yield字面意思:放手,放弃,投降
2. yield()方法的意思是告诉CPU执行其他的线程,当前线程让出CPU的执行权利
3. yield()方法不能保证使得当前正在运行的线程迅速转换到可运行的状态
4. yield()方法的作用就是将当前线程从执行中状态转变到可执行状态
5. yield()方法不能保证其他线程一定 能够执行,因为执行过yield()方法的线程当前依然是可执行的状态,有可能被cpu再次执行
6.执行yield()方法的线程不会释放锁
join()方 法
1.join()方法可以使得一个线程在另 -一个线程结束后再执行
2.如果join()方法在一个线程实例上调用,当前运行着的线程将阻塞直到这个线程执行完成了
3. join()方法可以设定超时时间,使得join()方 法的影响在超时后无效
4. join()重载方法有: join(long millis), join(long millis, int nanos)
5.当join()超时后,主方法和任务线程申请运行的时候是平等的
5. join()可以抛出InterruptedException对中断做出回应
线程组
线程组的作用
线程组可以批量管理线程或线程组对象,有效地对线程或线程组对象进行组织。