多线程就一定好吗?创建线程也是需要时间的
Thread.sleep() TimeUnt.*.sleep() 休眠 线程主动让出CPU 就绪——阻塞
Thread.yield 线程从运行到就绪 让出CPUe
线程是OS调度的单位 也是os分配CPC资源的单位
也是我们抢夺CPU的工具
线程的控制之通知线程停止:
A叫B干活 一些突发情况发生了 需要让B停止工作
方法一 直接kill stop()
法二:和B协商 A给B发出一个信号 让B停止 interrupt()
设了一个停止标志 实际上不会影响B的运行
使用多线程的场景:
1计算密集型任务时,需要提升速度 就要使用多线程
2当一个执行流阻塞 为了执行其他任务 可以引入多线程
import java.util.Scanner;
public class Main {
static long fib(int n) {
if (n == 0 || n == 1) {
return 1;
}
return fib(n - 1) + fib(n - 2);
}
// 没有引入线程时
public static void main1(String[] args) {
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.print("请输入一个数字: ");
int n = scanner.nextInt();
long r = fib(n);
System.out.printf("fib(%d) = %d\n", n, r);
}
}
// 引入一个线程来进行计算,主线程只负责读取用户输入
static class CalcFib extends Thread {
private final int n;
public CalcFib(int n) {
this.n = n;
}
@Override
public void run() {
long r = fib(n);
System.out.printf("fib(%d) = %d\n", n, r);
}
}
// 开个饭店,如果只有一个人:既当前台 + 也当厨师。如果用户点了耗时比较久的菜(把我占用了),导致没法接待新顾客
// 有了线程之后,“我”只负责前台工作,做菜交给另一个人,即使做菜比较慢,也不影响其他用户的体验
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.print("请输入一个数字: ");
int n = scanner.nextInt();
// 读取输入后,创建一个线程去计算
Thread t = new CalcFib(n);
t.start();
// 主线程直接读取下一个输入
}
}
}
线程知识小结:
代表一个独立的执行流 属于某个进程 OS的基本调度(分配CPU资源)单位
1提升效率 2阻塞的场景
线程在java中的表示+属性+常见方法
1 Thread对象 +Runnable对象的理解
2id name 优先级 状态 后台线程
3 启动操作 停止 等待停止
4休眠 让出CPU