1.什么是线程和进程
进程:正在运行的程序,操作系统支持多进程,PID:进程ID
线程:
- 进程中一条执行路径,也是CPU的基本调度单位
- 进程由多个线程组成,彼此间完成不同的工作,交替执行,称为多线程
如迅雷是一个进程,下载多个任务是多个线程
java虚拟机会自动创建一个主线程,主线程执行main方法
区别:
- 进程是操作系统分配资源的基本单位,而线程是CPU的基本调度单位
- 一个程序运行后至少一个进程
- 一个进程可以包含多个线程,但是至少需要一个线程
- 进程间不能共享数据段地址,但同进程的线程之间可以
2.线程的组成
- CPU时间片:操作系统会为每个线程分配执行时间
- 运行数据
- 堆空间:存储线程需使用的对象,多个线程可以共享堆中的对象。
- 存储线程需使用的局部变量,每个线程都拥有独立的栈。
- 线程的栈与main方法的栈是各自独立的。
- 线程的逻辑代码
执行特点
- 抢占式执行
- 效率高
- 可防止单一线程长时间独占CPU
- 在单核CPU中,宏观上同时执行,微观上顺序执行
- 在多核CPU中,每个核都可以独立执行一个线程,真正的并发执行
3.创建多线程的方式
3.1 继承Thread类,重写run()方法
启动线程,使用start方法,不能直接调用start方法
//1.继承Thread,重写run方法
public class MyThread extends Thread{
//4.设置线程名通过构造方法
public MyThread(String name){
//调用父类的构造方法
super(name);
}
@Override
public void run() {
for (int i = 0; i < 100; i++) {
//2.获取线程ID和名称
//两种方式
//方式一:this.getId() 获取线程ID this.getName() 获取线程名字
System.out.println(this.getId()+"。。。"+this.getName()+"。。。"+i);
//方式二:使用Thread.currentThread() 获取当前线程(推荐,灵活性高,不一定要继承Thread类)
System.out.println(Thread.currentThread().getId()+"。。。"+Thread.currentThread().getName()+"。。。"+i);
}
}
}
class TestMyThread{
//java虚拟机会自动创建一个主线程,主线程执行main方法
public static void main(String[] args) throws InterruptedException {
//创建子线程对象
MyThread thread = new MyThread("t1");
//3.设置线程的名称 -> 4进行简化
//thread.setName("t1");
MyThread thread2 = new MyThread("t2");
//thread2.setName("t2");
//启动线程,使用start方法,不能直接调用start方法
thread.start();
thread2.start();
//在mian主线程中
for (int i = 0; i < 100; i++) {
System.out.println("主线程"+i);
}
}
}
案例:买卖票
//实现卖票功能
public class TicketWin extends Thread {
public TicketWin(String name) {
super(name);
}
private int ticket = 100;
@Override
public void run() {
while (true) {
if (ticket <= 0) {
break;
}
System.out.println(Thread.currentThread().getName()+"买了第"+ticket+"张");
ticket--;
}
}
}
//测试类
class TestTicket{
public static void main(String[] args) {
TicketWin t1 = new TicketWin("t1");
TicketWin t2 = new TicketWin("t2");
TicketWin t3 = new TicketWin("t3");
TicketWin t4 = new TicketWin("t4");
t1.start();
t2.start();
t3.start();
t4.start();
}
}
内存图:
Click here to view the copyright notice of this site(点击此处查看本站版权声明)
必须 注册 为本站用户, 登录 后才可以发表评论!