目录
一、实现多线程
1进程
2线程
3多线程的实现方案
4设置和获取线程名称.
5线程调度
6线程控制
7线程生命周期
8多线程的实现方式
二、线程同步
1卖票
2同步代码块
3同步方法
4线程安全的类
5 Lock锁
1进程
进程:是正在运行的程序
●系统进行资源分配和调用的独立 单位
●每一个进程都有它自己的内存空间和系统资源
2线程
线程:是进程中的单个顺序控制流,是一条执行路径
●单线程: 一个进程如果只有一条执行路径,则称为单线程程序
●多线程: 一个进程如果有多条执行路径,则称为多线程程序
3多线程的实现方案
方案1:继承Thread类
定义一个类MyThread继承Thread类
●在MyThread类中重写run()方法
创建MyThread类的对象
4设置和获取线程名称.
Thread类中设置和获取线程名称的方法
●void setName(String name):将此线程的名称更改为等于参数name
String getName():返回此线程的名称
通过构造方法也可以设置线程名称
package Demo01;
/*/
* 主线程 执行main方法的线程
* 单线程程序:只有一个线程在执行,从头到尾
*/
public class demo01MAainThread {
public static void main(String[] args) {
Person p1=new Person("强");
p1.run();
//System.out.println(0/0);
Person p2=new Person("明");
p2.run();
}
}
package Demo01;
/*/
* java.long.Thread
* 实现步骤:
* 1.创建一个Thread类的子类
* 2.在Thread子类中重写run方法,设置线程任务(干什么)
* 3.创建Thread子类的对象
* 4.调用Thread类中的方法start来启动线程,执行run方法
*/
public class Demo01Thread {
public static void main(String[] args) {
//3.创建子类对象
MyThread mt=new MyThread();
//4.调用start方法
mt.start();
for(int i=0;i<20;i++) {
System.out.println("主线程: "+i);
//if(i==10)
//System.out.println(0/0);
}
}
}
5线程调度
线程有两种调度模型
分时调度模型:所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间片
●
抢占式调度模型:优先让优先级高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个, 优先级高的线程
6线程控制
package demo02;
/*/
* java.long.Thread
* 实现步骤:
* 1.创建一个Thread类的子类
* 2.在Thread子类中重写run方法,设置线程任务(干什么)
* 3.创建Thread子类的对象
* 4.调用Thread类中的方法start来启动线程,执行run方法
*/
public class Demo01Thread {
public static void main(String[] args) {
//3.创建子类对象
MyThread mt=new MyThread();
//4.调用start方法
mt.start();
new MyThread().start();
new MyThread().start();
new MyThread().start();
System.out.println("main: "+Thread.currentThread().getName());
}
}
```java
package demo02;
public class Demo02ThreadSetName {
public static void main(String[] args) {
MyThreadName mt=new MyThreadName("强");
mt.start();
new MyThreadName("小狗").start();
}
}
7线程生命周期
线程的生命周期:也就是线程从生到死的过程。它分为这样的几个过程:新建,就绪,运行,死亡
但是在运行的过程中,可能会因为其他方法的调用,而让该线程处于一种新的过程:阻塞
```java
package demo03;
public class Demo03Sleep {
public static void main(String[] args) {
for(int i=1;i<10;i++) {
System.out.println(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
}