单页网站有哪些,青海省教育厅门户网站登录,成都设计网站建设,30秒网站Thread 类使用 start 方法#xff0c;启动一个线程#xff0c;对于同一个 Thread 对象来说#xff0c;start 只能调用一次#xff01;#xff01;#xff01; 不怕名字起的长#xff0c;就怕含义不清楚#xff01;
想要启动更多线程#xff0c;就是得创建新的对象启动一个线程对于同一个 Thread 对象来说start 只能调用一次 不怕名字起的长就怕含义不清楚
想要启动更多线程就是得创建新的对象
调用 start 创建出新的线程本质上是 start 会调用 系统的 api来完成创建线程的操作。
start 和 run 的区别重点 终止线程
不能说是中断一个线程中断这个词有很多含义操作系统底层也有中断概念CPU上/各种设备也有中断概念。
更好的说法是终止一个线程让线程 run 方法【入口方法】执行完毕
main 方法对应的是主线程
怎么让线程提前结束
核心就是让 run 方法能够提前就结束 取决于 具体代码实现方式。
为了让线程结束引入标志位。
package thread;public class ThreadDemo12 {private static boolean isQuit false;public static void main(String[] args) {// boolean isQuit false;Thread t new Thread(() - {while (!isQuit) {System.out.println(我是一个线程, 工作中!!);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}// 当前是死循环, 给了个错误提示.System.out.println(线程工作完毕!);});t.start();try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}isQuit true;System.out.println(让 t 线程结束!);}
} 通过上述代码就可以让线程结束掉。具体线程什么时候结束取决于在另一个线程中何时修改 isQuit 的值。
main 线程想要让 t 线程结束大前提一定是 t 线程的代码对这样的逻辑有所支持。而不是 t 里的代码随便怎么写都能提前结束。如果代码不配合main 无法让 t 提前结束。
run方法和main方法是两个线程这两个线程的执行顺序是不确定的 上面的写法不够优雅Thread 类提供了一种更优雅的选择。让 Thread 对象内置了这个变量。 这个代码本质上就是使用 Thread 实例内部自带的标志位来代替刚才手动创建的 isQuit 变量了。 如果没有 sleepinterrupt 可以让线程顺利结束有 sleep 引起了变数
在执行 sleep 的过程中调用 interrupt大概率 sleep 休眠时间还没到被提前唤醒了。
提前唤醒会做两件事
1.抛出 InterruptedException紧接着就会被 catch 获取到
2.清除 Thread 对象的 isInterrupted 标志位 通过 interrupt 方法已经把标志位设为 true 了但是 sleep 提前唤醒操作就把标志位又设回 false此时循环还是会继续执行
要想让线程结束只需要在 catch 中加上 break 就行了 这个日志是代码中打出来的如果不写打印就不会存在了 sleep 清空标志位是为了给程序员更多的“可操作空间”
前一个代码写的是sleep(1000)结果现在1000还没到就要终止线程这就相当于是两个前后矛盾是操作此时是希望写更多代码来对这样的情况进行具体处理。
此时程序员可以在 catch 语句中加入一些代码来做一些处理
1让线程立即结束加上 break
2让线程不结束继续执行不加 break
3让线程执行一些逻辑之后再结束写一些其他代码再 break 等待线程