一.线程创建
线程基础知识介绍
什么是线程?为什么要使用线程?
在没有使用到线程的程序中,我们总是只能串行的执行程序,也就是我们的程序一次性只能进行一个操作。而我们使用微信进行视频聊天的时候,我们可以一边视频,一边和其他人打字聊天。这就是多线程,可以一个线程负责视频聊天,一个线程负责打字聊天,使用的任然是一个程序。在日常使用场景中,多线程是必要的。
创建方法一:继承Thread类
Thread单词意思就是线程的意思,是Java提供的一个线程类。可以自己创建一个类然后继承Thread,重写run方法。run方法写入你想要进行多线程运行的代码。
通过你建的类,实例化一个对象;通过这个对象调用start()方法,该对象就可以进行多线程操作了。
创建步骤:
1.继承Thread类,重写run方法
2.实例化一个对象,调用start方法(就是执行run函数里面的内容)
代码演示:
//1 创建两个类,继承Thread,都重写run方法
class Thread1 extends Thread{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("Thread1 running!");
}
}
}
class Thread2 extends Thread{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("Thread2 running!");
}
}
}
//2 对这两个类分别实例化一个对象,调用start方法
public class Demo1 {
public static void main(String[] args) {
Thread1 thread1 = new Thread1();
Thread2 thread2 = new Thread2();
thread1.start();
thread2.start();
}
}
运行结果发现,Thread1线程和Thread2线程轮流上处理机执行,由此可知该段程序确实实现了多线程操作
创建方法二:实现Runnable接口
Runnable是一个接口,该接口是一个函数式接口(不知道函数式接口的伙伴,可以看看我上一篇博客哦),只有一个抽象方法run
创建方法一的Thread类就是实现了Runnable接口,查看源码如下图:
那为什么已经有Java开发人员已经给我们封装好的Thread类,有更多的方法可以供我们调用,我们还要用Runnable接口来实现线程,不是很冗余嘛,容我卖个关子,会在代码中解释。
创建步骤:
1 创建一个类实现Runnable接口,重写run方法
2 通过该类实例化对象
3 将实例化的对象作为参数传到Thread实现线程,再调用start方法
//1 创建Demo1实现Runnable接口,重写run方法
public class Demo1 implements Runnable{
//run方法模拟买票场景
int ticket = 10; //设置票数为10
@Override
public void run() {
// 只要票数有剩余,就可以一直进行买票
while (ticket > 0){
// Thread.currentThread()该静态方法可以获得当前运行的线程 getName()得到线程名称
System.out.println(Thread.currentThread().getName() + " get " +ticket--);
}
}
public static void main(String[] args) {
//2 实例化一个demo1对象
Demo1 demo1 = new Demo1();
//3 将实例化的对象作为参数传到Thread实现线程
//Thread有传入一个对象的构造器,构造器还能加入线程的名称
//实例化了多个Thread类,再调用start方法,就能实现多个线程对同一个对象进行操作
//这就是为什么还要用Runnable接口来实现线程的原因
new Thread(demo1,"pp").start();
new Thread(demo1,"mc").start();
new Thread(demo1,"pp1").start();
new Thread(demo1,"mc1").start();
}
}
上面代码用到的构造器:
细心的伙伴在运行代码的时候会发现,票数可能出现负数的情况,这是明显的异常,原因是多个线程买了同一张票,为了解决这个问题,需要用到线程同步的知识,将在后续章节介绍。