1.什么是线程
线程,又称轻量级进程(Light Weight Process)。 进程中的一条执行路径,也是CPU的基本调度单位。 一个进程由一个或多个线程组成,彼此间完成不同的工作, 同时执行,称为多线程。
2.进程与线程的区别
1.进去是操作系统资源分配的基本单位,而线程是CPU基本调度单位。
2.一个程序运行后至少有一个进程。一个进程可以包含多个线程,但至少需要一个线程。
3.进程间不能共享数据段地址,但是同进程的线程可以。
3.线程的组成
任何一个线程都具有最基本的组成部分
1.CPU时间片:操作系统(os)会为每个线程分配执行时间。
2.运行数据: 堆空间:存储线程需要的对象,多个线程可以共享堆的中的数据。
栈空间:存储线程需要的局部变量,每个线程都拥有独立的栈。
3.线程的逻辑代码。
4.线程的特点
1.线程抢占式执行。
效率高 可防止单一线程长时间占用CPU
2.在单核CPU中,宏观上同时执行,微观上顺序执行。
5.线程的创建
1.继承 Thread类,重写run方法
package com.lzl.test01;
/**
* @create 2022-07-18
*/
//继承Thread 方法重写 run方法
public class MyThread extends Thread{
@Override
public void run() {
System.out.println("----------");
}
}
package com.lzl.test01;
/**
* @create 2022-07-18
*/
public class Test01 {
public static void main(String[] args) {
//创建线程对象
MyThread myThread =new MyThread();
//开启线程
myThread.start();
}
}
2.实现Runnable接口
package com.lzl.test01;
/**
* @create 2022-07-18
*/
//实现 Runnable 接口
public class MyRunnable implements Runnable{
@Override
//重写run方法
public void run() {
System.out.println("-----------");
}
}
package com.lzl.test01;
/**
* @create 2022-07-18
*/
public class Test02 {
public static void main(String[] args) {
//创建线程对象
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
//开启线程
thread.start();
}
}
3.实现Callable接口, 他和实现Runnable接口差不多,就是该接口中的方法有返回值和异常抛出
package com.lzl.test01;
import java.util.concurrent.Callable;
/**
* @create 2022-07-18
*/
//实现 Callable 接口
public class MyCallable implements Callable {
@Override
//该接口中的方法有 返回值 和 抛出异常
public Object call() throws Exception {
return 200;
}
}
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
/**
* @create 2022-07-18
*/
public class Test03 {
public static void main(String[] args) throws ExecutionException, InterruptedException {
//创建线程对象
MyCallable myCallable = new MyCallable();
//创建一个单一线程池
ExecutorService executorService = Executors.newSingleThreadExecutor();
//提交任务给线程池中线程对象、Runnable和Callable类型的任务。
Future submit = executorService.submit(myCallable);
//获取执行方法后的返回值
Object o = submit.get();
System.out.println(o);
}
}
6.获取和设置线程的名称
1.获取线程的ID和线程名称
1.在Thread的子类中调用this.getid()或this.getName();
2.使用Thread.currentThread().getId()或Thread.currentThread().getName().
package com.lzl.test02;
/**
* @create 2022-07-18
*/
public class Test01 {
public static void main(String[] arg