一.什么是线程
一个线程就是一个执行流,多个线程就是多个执行流,多线程就是让多个执行流分别执行自己的代码。
比如:利用多线程在控制台上循环交替打印A和B
package demo;
public class Main {
static class SubThread extends Thread{
@Override
public void run() {
while(true){
System.out.println("A");
}
}
}
public static void main(String[] args) {
SubThread subThread=new SubThread();
subThread.start();;
while(true){
System.out.println("B");
}
}
}
在上面的代码中,有两个执行流,一个循环打印A,一个循环打印B,执行结果如下:
二.线程的特点与优势
多线程能够实现并发编程,但多进程也能实现并发编程,但是多线程它主要有以下的优点与优势:
1.线程比进程更加的轻量级
2.创建线程比创建进程更快
3.调度线程比调度进程更快
4.销毁线程比销毁进程更快
三.线程与进程的关系与区别
1.线程是比进程更加的轻量级的
2.一个进程里包含一个或多个线程,且一个进程里至少包含一个线程(必须有主线程)
3.一个线程只能属于一个进程
4.进程与进程之间不能共享内存空间,线程与线程之间可以共享内存空间
5.进程是操作系统分配资源的最小单位,线程是操作系统调度的最小单位
操作系统:操作系统本质上是一个软件,一个专门用来管理的软件。
对下:管理硬件设备
对上:管理应用程序和其他软件
四.创建线程的五种方式
1.直接继承Thread线程类,重写run方法
package demo;
//直接继承线程类
public class MyTread01 extends Thread{
@Override
public void run() {
while(true){
System.out.println("A");
}
}
public static void main(String[] args) {
MyTread01 myTread01=new MyTread01();
myTread01.start();
}
}
2.实现Runnable接口
实现Runnable接口并重写run方法
package demo;
//实现Runnable接口并重写run方法
public class MyTask implements Runnable{
@Override
public void run() {
while(true){
System.out.println("A");
}
}
public static void main(String[] args) {
Thread t=new Thread(new MyTask());
t.start();
}
}
3.匿名内部类创建Thraed子对象
package demo;
public class MyThread03 {
//匿名内部类创建Thread子对象
public static void main(String[] args) {
Thread t=new Thread(){
@Override
public void run() {
while(true){
System.out.println("A");
}
}
};
t.start();
}
}
4.匿名内部类创建Runnable子对象
package demo;
public class MyThread04 {
//匿名内部类创建Runnable子对象
public static void main(String[] args) {
Thread t=new Thread(new Runnable() {
@Override
public void run() {
while(true){
System.out.println("A");
}
}
});
t.start();
}
}
5.使用Lambda表达式创建匿名Thread子对象
package demo;
public class MyThread05 {
//使用lambda表达式创建Thread匿名子对象
public static void main(String[] args) {
Thread t=new Thread(()->{
while(true){
System.out.println("A");
}
});
t.start();
}
}