多线程初阶————
1,认识线程
1.1 概念
1)线程是什么
线程就是一个“执行流”,可以理解为程序执行的最小单位;
可以看成轻量级的进程;
2)为啥要有线程
“并发编程” 的需要,但是我们不是已经有进程了吗,我们要知道,我们进行的是服务器开发,我们在访问网站的时候,一个用户进行访问就是一个进程,用户的数据量是非常庞大的,进程的创建和销毁需要的开销就会变得非常非常大,这样我们就引出了线程,让一个进程中包含一个或多个进程,提升效率,
3)线程和进程的区别
1,进程是操作系统进行资源分配的基本单位,线程是操作系统进行运算调度的基本单位;
2,线程的创建,销毁,调度需要的开销更小;
3,进程之间互不影响,同一进程下的线程会互相影响,创建进程后会自动创建一个线程,第一个线程会涉及到申请资源的操作,其余线程不会涉及,进程销毁才会释放资源,线程的销毁不会释放资源;
4,因为线程是调度相关,所以每一份线程都有调度相关的数据
5,一个进程死掉了不会影响其他进程,但是一个进程中一个线程死掉了就掀桌了,全部都运行不了了;
4)java中线程和操作系统的关系
java中包装好了操作系统中对线程操作的API,但是java是不推荐多进程编程的,我们只去学习多线程编程;
1.2 第一个多线程程序
class MyThread extends Thread{
public void run(){
System.out.println("myThread");
}
}
public class Demo1 {
public static void main(String[] args) {
Thread thread = new MyThread();
thread.start();
System.out.println("main");
}
}
main就是进程刚创建我们自动生成的第一个线程,运行
只是个示范,看接下来的讲解就好;
1.3 创建线程
1)创建对象继承Thread类
class MyThread2 extends Thread{
public void run(){
while(true){
System.out.println("MyThread2 线程");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
public class Demo2 {
public static void main(String[] args) {
Thread thread = new MyThread2();
System.out.println("主线程");
}
}
我们创建一个类,让它继承Thread类,Thread类中给我们提供了一个run方法,让我们自己去写里面的内容,我们就在自己实现的类中重写run方法,我们循环打印,并且打印一次睡眠1秒,在主线程也就是main方法中,打印主线程,我们来看运行结果;
只有一个主线程,因为我们没有去调度线程,我们可以直接用.run或者是.start来开启线程
thread.run();
程序一直在运行,这里不明显,我们来借助一个工具,
找到jdk中的bin ,
以管理员身份运行它
找到我们刚才创建的Demo2
点击线程
我们看到main线程一直在等待,因为我们使用的run方法,所以是在主线程上运行的,如果我们想看到我们自己创建的线程,就要用start
我们在试试;
这个Thread——0就是我们自己创建的线程,但是main呢,还有为啥先打印的主线程呢,因为调度随机的,我们不知道操作系统让拿个线程先执行,所以就会发生这样的状况,这也是我们后期要重点掌握的,要怎么保证线程之间协调配合,避免乌鸦哥掀桌,哈哈哈,main线程在这里已经结束了,没啥好说的了,下一个;
2)实现Runnable接口
class MyRunnable implements Runnable{
public void run(){
while(true){
System.out.println("MyRunnable 线程");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
public class Demo3 {
public static void main(String[] args) {
Thread thread = new Thread(new MyRunnable());
thread.start();
System.out.println("主线程");
}
}
这是第二种,我们Runnable接口,我们还是要使用Thread类来创建,这不有病吗.........这么麻烦,还不如用第一种,其实这种想法是不对的,大家听,没听过,高内聚低耦合,这里就谈到了低耦合,我们使用接口,在想要修改的时候去修改接口的代码即可,是不影响Thread的,但是我们使用Thread的时候,想要修改的时候,就要修改Thread