初步多线程
一.了解多线程
多线程
多任务的执行,多路径执行
如果没有多任务,就不需要使用多线程
多线程学习目标:
1.创建与开启多线程
2.线程状态
3.线程安全
4.线程通信
线程创建与开启
1.继承Thread类,重写run() +start()
注意 继承父类->单继承
run方法不能抛出异常,没有返回值
2.实现Runnable接口,重写run()+start() -->
3.juc包下Callable接口,重写call()方法
二.方式一继承Thread
package com.xx.thread;
public class Thread01 extends Thread{//继承Therad
public static void main(String[] args) {
Thread01 thr=new Thread01();//创建线程
thr.start();//开启线程
for (int i = 0; i <=3 ; i++) {//主线程
System.out.println("听歌");
try {
Thread.sleep(400);
} catch (InterruptedException e) {//捉异常
e.printStackTrace();
}
}
}
public void run(){//重写run方法
for(int i=1;i<=3;i++){
System.out.println("吃饭");
try {
Thread.sleep(300);//捕捉异常
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
.
三.方式二.实现接口Runnable
创建线程方式二;
实现Runnable接口,重写run()方法
优点;
接口可以多实现,类只能单继承
实现资源共享
package com.xx.thread;
public class Runnabl02 implements Runnable{
public static void main(String[] args) {
Runnabl02 ru=new Runnabl02();//创建真实对象
Thread thread=new Thread(ru);//代理
thread.start();//开启线程
for (int i = 0; i <5 ; i++) {
System.out.println("一边听歌");
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
public void run() {//重写run方法
for (int i = 0; i <5 ; i++) {
System.out.println("一边吃饭");
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
四,使用Lambda简化接口实现
package com.xx.thread;
public class Class_Lambda {
public static void main(String[] args) {
new Thread(new Runnable() {//匿名类不类
@Override
public void run() {
for (int i = 0; i <3 ; i++) {
System.out.println("吃饭");
}
}
}).start();
new Thread(()->{//Lambda表达式
for (int i = 0; i <5 ; i++) {
System.out.println("hhah");
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}
五.线程状态
- 线程的状态:
新生状态 : new Thread(),new的时候就是一个线程进入新生状态
就绪状态 : start() 一个线程就会进入到就绪状态,进入就绪队列进行等待,可以等待cpu的调度
运行状态 : 当cpu调用调度到就绪队列中的某一个线程,这个线程开始进入运行状态
阻塞状态 : 线程无法正常执行,可以能会进入到阻塞状态
终止状态 : 线程执行完毕
- 一个线程如何进入到就绪状态:
1.start()
2.线程切换 : 被切换的线程恢复到就绪状态,等待下一次被调用
3.阻塞解除
4.yield() 礼让线程
- 进入阻塞状态的方式:
1.sleep()
2.join()
3.wait()
4.IO等
- 进入终止状态的方式:
1.stop() 终止方法-->不推荐使用->比较暴力手法 2.通过添加标识判断 --> 推荐 3.正常执行完毕
- 注意:
1.一个线程一旦执行完毕,不能回复,重新new,也是新的线程
2.阻塞解除无法直接恢复到运行状态,会恢复到就绪状态,等待下一次被cpu调度