线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
我理解进程就像一个管道,并没有真正的执行,而线程就像管道里的每一条水流,线程才是cpu执行调度真正单位。
首先咱们说
线程的创建
第一种方式就是继承别人写好的Thread类
重写run方法体 调用start方法进入准备就绪状态等待cpu调用
public class OneThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println("线程1"+i);
}
}
public static void main(String[] args) {
OneThread oneThread = new OneThread();
oneThread.start();
for (int i = 0; i < 1000; i++) {
System.out.println("线程2"+i);
}
}
}
第二种方式是直接实现Runnable接口
public class TwoThread implements Runnable{
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println("线程1"+i);
}
}
public static void main(String[] args) {
TwoThread twoThread = new TwoThread();
new Thread(twoThread,"线程1").start();
for (int i = 0; i < 1000; i++) {
System.out.println("线程2"+i);
}
}
}
第三种是实现Callable接口
不过多解释。
线程的生命周期
线程的停止
利用标识符,true或者false停止循环来停止线程。
线程的休眠
sleep方法
Thread.sleep(3);利用线程休眠循环获取当前时间
public class SleepThread implements Runnable{
@Override
public void run() {
//获取系统时间
while(true){
Date date = new Date(System.currentTimeMillis());
try {
Thread.sleep(1000);
System.out.println(new SimpleDateFormat("HH:mm:ss").format(date));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new Thread(new SleepThread()).start();
}
}
模拟倒计时
/**
* @author : LeeGaki
* @date : 2022/6/4 10:05
* 面向面试编程 --> 李佳琪
*/
public class DownTime {
public static void main(String[] args) {
downTime(100);
}
public static void downTime(int m){
while(true){
if (m==0){
break;
}
try {
Thread.sleep(1000);
System.out.println("还剩下"+m--+"秒");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
线程的礼让
也不是真正的礼让,两个进程过来cpu选择了A线程,然后A线程礼让
就会退出执行A线程从AB中重新选择,再选到谁,还是看cpu心情。
/**
* @author : LeeGaki
* @date : 2022/6/4 10:10
* 面向面试编程 --> 李佳琪
*/
public class ThreadYield implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"执行了");
//线程礼让
Thread.yield();
System.out.println(Thread.currentThread().getName()+"结束了");
}
public static void main(String[] args) {
new Thread(new ThreadYield(),"线程1").start();
new Thread(new ThreadYield(),"线程2").start();
}
}
线程的插队
用join方法,别人都要等执行join方法的线程执行完才能继续。
线程的状态
线程的优先级
线程的守护
gc是垃圾回收线程 为守护线程。
thread.setDaemon(true)开启守护线程。
默认false为用户线程,正常都是用户线程。
用户线程执行完毕,虚拟机不管守护线程完没完都停止。