一. 线程的概述
进程:正在运行的程序,负责了这个程序的内存空间分配,代表了内存中的执行区域。
线程:就是在一个进程中负责一个执行路径。
多线程:就是在一个进程中多个执行路径同时执行。
多线程的好处:
1.解决了一个进程里面可以同时运行多个任务(执行路径)。
2.提供资源的利用率,而不是提供效率
多线程的弊端:
1.降低了一个进程里面的线程执行频率。
2.对线程进行管理 要求额外的CPU开销,线程的使用会给系统带来上下文切换的额外负担。
3.公有变量的同时读或写,当多个线程需要对公有变量进行写操作时,后一个线程会修改掉前一个线程存放的数据,发生线程安全问题。
4.线程的死锁,即较长时间的等待或者资源竞争以及死锁等多线程症状
二. 创建线程的方式
(1) 方式一
1.自定义一个类继承Thread类
2.重写Thread 类的run方法,把自定义线程的任务代码写在run方法中。
重写run方法的目的是:因为每个线程都有自己的任务代码,jvm创建的主线程的任务代 码就是main方法中的所有代码,自定义线程的任务代码就是写在run方法中,自定义线程 负责了run方法的执行
3.创建Thread的子类对象,并且调用start方法开启线程。
注意:一个线程一旦开启,那么线程就会执行run方法中的代码,run方法千万不能直接调用,直接调用run方法就相当于调用了一个普通方法,并且没有开启新的线程
图片.png
(2)方式二
/*
实现线程的第二种方式
方式二:
1. 自定义一个类实现Runnable接口。
2. 实现Runnable接口 的run方法,把自定义线程的任务定义在run方法上。
3. 创建Runnable实现类对象。
4. 创建Thread类 的对象,并且把Runnable实现类的对象作为实参传递。
5. 调用Thread对象 的start方法开启一个线程。
问题1: 请问Runnable实现类的对象是线程对象吗?
Runnable实现类的对象并 不是一个线程对象,只不过是实现了Runnable接口 的对象而已。
只有是Thread或者是Thread的子类才是线程 对象。
问题2: 为什么要把Runnable实现类的对象作为实参传递给Thread对象呢?作用是什么?
作用就是把Runnable实现类的对象的run方法作为了线程的任务代码去执行了。
推荐使用: 第二种。 实现Runable接口的。
原因: 因为java单继承 ,多实现的。
*/
class SaleTicket implements Runnable{
int num = 50; // 票数
@Override
public void run() {
while(true){
synchronized ("锁") {
if(num>0){
System.out.println(Thread.currentThread().getName()+"售出了第"+ num+"号票");
num--;
}else{
System.out.println("售罄了..");
break;
}
}
}
}
}
public class Thread_05 {
public static void main(String[] args) {
//创建了一个Runnable实现类的对象
SaleTicket saleTicket = new SaleTicket();
//创建三个线程对象模拟三个窗口 ,,创建Thread类的对象, 把Runnable实现类对象作为实参传递。
Thread thread1 = new Thread(saleTicket,"窗口1");
Thread thread2 = new Thread(saleTicket,"窗口2");
Thread thread3 = new Thread(saleTicket,"窗口3");
//调用thread对象的start方法开启线程。开启线程售票
thread1.start();
thread2.start();
thread3.start();
}
}
网友评论