Java中的多线程
一、进程的概念
进程:程序的执行过程,它持有资源(共享内存、共享文件)和线程
执行过程:代表着动态性
持有:代表着载体
资源:代表内存
二、线程的概念
线程:是程序中最小的执行单元
一个进程中可以有多个线程
多个线程需要通信才能正常工作称之为线程的交互,交互的方式又分为两种:互斥(相互抢夺资源)和同步(相互配合)
栗子(好好吃):进程可以类比班级,是学校的一个单元(windows上的一个程序);而线程就是班级里面的学生,是班级里面种最小的一个执行单元(线程),而上体育课(执行任务),打篮球的进攻双方互相抢夺篮球的控制权(互斥:多线程抢夺CPU的控制权),而攻守双方中的球员彼此不会抢夺己方的篮球控制权(同步:相互配合,不会想多CPU的控制权,只有等到篮球传递到自己的手上才会进行任务)。
三、Java对线程的支持(创建以及常见方法)
-
创建方式(4种)
继承Thread接口
实现Runnable接口
使用Callable和Future创建线程
通过线程池获取(Executor)
-
Tread的常用方法
-
线程的启动
调用Thread的start()方法启动。
一般这里会出现面试题:run()方法和start()方法的区别?
调用run()方法只是单纯的调用了一个方法,而start()方法才是线程的正确启动方法。
-
线程的结束
Thread类中有一个stop()方法,但是!!!!!!这个stop方法并不推荐使用,究其根本是因为这个方法是Java1.0提供的,不是说他出现的早而不用,而是另有其他的原因:因为它会让我们的线程直接结束,就相当于至接拔掉电脑的电源,你都不知道线程执行到了什么地方和完成了什么任务,所以并不推荐这种方式来结束掉线程。
正确的结束方式为:设置结束标志
-
线程的同步
同步锁、同步方法、同步代码块
常见的面试题:wait()与sleep()的区别?
- sleep() 方法是线程类(Thread)的静态方法,让调用线程进入睡眠状态,让出执行机会给其他线程,等到休眠时间结束后,线程进入就绪状态和其他线程一起竞争cpu的执行时间。 因为sleep() 是static静态的方法,他不能改变对象的机锁,当一个synchronized块中调用了sleep() 方法,线程虽然进入休眠,但是对象的机锁没有被释放,其他线程依然无法访问这个对象。
- wait()是Object类的方法,当一个线程执行到wait方法时,它就进入到一个和该对象相关的等待池,同时释放对象的机锁,使得其他线程能够访问,可以通过notify,notifyAll方法来唤醒等待的线程