(3) 继承Thread类来创建线程和实现Runable接口创建线程的区别?
(1)什么是程序,进程和线程?
(i)程序可以大概理解为电脑安装的文件,比如说英雄联盟啊之类的。
(ii) 进程运行时候的程序,是操作系统分配的最小内存单位,一个进程可以启动多个线程。
(iii)线程是进程中的一部分,cpu的最小执行单位。
(2)创建线程的三种方式?
(i)继承Thread类
(ii)实现Runable接口
(iii)实现Callable接口
(3) 继承Thread类来创建线程和实现Runable接口创建线程的区别?
(1)继承Thread类创建线程的方式本质上就是创建了一个线程对象。可以直接new一个然后start。
(2)实现Runable创建线程的方式,实际上是创建了一个线程任务,不是一个线程,还需要再new一个线程,记得要把线程的任务扔进去,这也就意味着创建的线程们都拥有同一个线程任务,共享同一份资源,非常适合多线程处理相同的资源。
public class MainTest {
public static void main(String[] args) {
//创建线程事件
SaveThread saveThread = new SaveThread();
//创建两个相同事件的线程
Thread a = new Thread(saveThread);
Thread b = new Thread(saveThread);
a.start();
b.start();
}
}
(4)线程的方法(线程的优先级别)
(1)线程的优先级别不是绝对的,不一定对线程的优先级别越高就一定对cpu的抢占权越高
线程的优先级别默认是5,最高是10,最低是1.。
(2)如果在主线程中先设置线程优先级别为8,那么主线程的剩下所有子线程的优先级别都是8,而不是默认值5。
(3)Unix系统使用的是时间片算法,而Windows则属于抢占式的。
(5)线程的状态以及图解
(1)新建:当一个线程被new出来的时候,新生的线程对象属于新建状态
(2)就绪:当一个线程被start的时候,会进入线程队列等待。
(3)运行:当已经就绪的线程被调度获取cpu资源的时候会进入运行状态,run方法定义了线程的功能
(4)阻塞:线程被认为挂起,或者线程内部有执行输入或者输出的方法的时候线程会阻塞。
(5)死亡:线程完成工作或者被强制性终止就会死亡
(6)多线程的概念 ,优点,缺点
(概念) 在一个程序中可以同时运行多个不同的线程来执行任务,意思就是允许单个程序创建多个并行线程来完成各自的任务
(优点)提高程序的响应,提高cpu的利用率,改善程序结构,将复杂的任务分为多个线程来执行。
(缺点)线程越多占用内存越多,线程之间共享资源会相互影响。意思就是多个线程再对用一资源同时进行操作的时候,会出现严重的错误。
(7)线程同步的概念
多个线程同时访问同一个资源的时候,可能会引起冲突 ,为了避免这种情况的发生,我们需要给线程加锁
(8)关键字synchronized和接口lock
(1)synchronized是关键字,可以用来修饰同步代码块或者方法,该执行原理是再jvm层面上,但是lock是一个类,通过方法来对锁来进行控制
(2)synchronized在遇到异常的时候会隐式释放锁,安全性比较高,lock遇到异常的时候不会自动释放锁,所以要在finally里面实现unlock主动释放锁。从此避免线程死锁。
(3)在面对大量数据的时候,lock的性能更加优越。
(9)线程死锁
不同的线程分别占用对方需要的同步资源,都在等待对方放弃自己需要的同步资源,就会形成线程死锁
(10)线程通信
(1).wait一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器。
(2).notify一旦执行此方法,就会唤醒被wait的一个线程。如果有多个线程被wait,就唤醒优先级高的那个。.
(3)notifyAll一旦执行此方法,就会唤醒所有被wait的线程。
注意:.wait(),notify(),notifyAll()三个方法必须使用在同步代码块或同步方法中。