多线程
进程: 每个程序的运行都是一个进程的运行。当我们在电脑上同时打开了很多程序,意味着多个进程在运行。CPU处理器分毫秒级地切换地处理各进程的线程,达到多个进程同时运行的状态。
线程:每个进程拆分开来的一步步程序操作,叫线程。
1.Java
在java中,线程的父类是Thread
类。目前我学到的两种通过该类实现多线程的方法如下:
第一种–继承Thread类
- 继承Thread;
- 子类重写(覆盖)父类的run()方法;
- 创建子类对象;
- 启动多线程
.start()
第二种–实现Runable接口
- 构造一个类实现Runable接口;
- 重写(覆盖)Runable接口的Run方法;
- 创建Thread的(有参构造方法)实现类对象;
- 启动多线程
.start()
这两种方法比较,第一种用子类run的方法感觉上方便。
以下提供了线程运行时的3个方法:
a.sleep(long millis(限时等待时间)) —>变成 限时 等待状态
a.yield() —>让出这1次的竞争(谦让)
a.join() —> 在多线程执行时,让变量插队执行到底。
重点来了
线程同步,线程安全
直接讲重点:synchornized( 临界资源 ){//代码块是原子操作}
synchornized 关键字 提供了上锁的作用, 被修饰的代码在执行时,其他线程由于没有(synchornized)锁标记不会插入,即必须执行完一个某个线程的synchornized代码块之后,才会正常按多线程方式执行。
这样涉及到了另一种情况,多重synchornized情况下,不同线程取得了不同的锁标记,使得程序无法进行下去,产生各个线程均 阻塞(blocked) 的情况,称为 死锁
死锁破解
解决死锁的方法:
a.wait() //释放自己的锁标记进入无限等待状态
a.notify() a.notifyAll() //唤醒无限等待状态的线程,继续进行程序
注意:wait() notify() 两个方法均在synchornized代码块中写,
因为synchornized代码块就是锁标记
注意:二者是一个变量。