1.线程创建
(1)可以通过继承Thread创建并重写run方法
(2)可以通过Runnable接口重写run方法
(3)可以使用匿名内部类创建Thread子类对象
(4)可以使用匿名内部类创建Runnable子类对象
(5)可以使用Lambda表达式(一般使用这个看起来清楚些)
2.线程中断
直接使用Java内部Thread的 Thread.currentThread().isInterrupted() 方法 然后使用
interrupt()中断
public static void main(String[] args) { Thread t = new Thread(()->{ while (!Thread.currentThread().isInterrupted()) { System.out.println("hello thread"); try { Thread.sleep(1000); } catch (InterruptedException e) { //e.printStackTrace(); break; } } System.out.println("t 线程执行完了"); }); t.start(); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } t.interrupt(); System.out.println("设置让 t 线程结束!"); }
3.线程等待
在Java中使用join()方法实现线程的等待
在main中调用 t.join() 的效果就是:让main线程先堵塞等待,等到 t 执行完成之后 main线程才继续执行
使用t.join()不带参数的意思:就好像是不见不散一样,必须等到t线程结束了才可以执行main线程
使用t.join()带参数的意思:就是等到那个时候了 t.join() 线程还没结束 那就不等了,就执行main线程
4.线程休眠
使用Thread.sleep() 方法实现线程的休眠,让线程阻塞 括号里面可以指定休眠的时长单位为毫秒
操作系统管理这个线程的PCB的时候是有多个链表的,系统中的PCB分布在就绪队列和堵塞队列(队列中是有链表串联起来的),一个线程在就绪队列中中某一个链表调用了sleep ,则这个PCB就会被移动到堵塞队列中 等到时间一到 就返回就绪队列里面原来的那个位置(且回去了也不一定立马就被执行 得看系统的心情)