文章插图
不设置线程名运行效果如下
文章插图
sleep方法sleep方法可以让线程阻塞指定的毫秒数 。时间到了后,线程进入就绪状态 。sleep可用来研模拟网络延时,倒计时等 。每一个对象都有一个锁,sleep不会释放锁,锁的概念后边会详细讲解
实现类:
public class RunnableImpl implements Runnable{@Overridepublic void run() {// 输出10以内偶数for (int i = 0; i < 10; i++) {if (i % 2 == 0){try {// 休眠1秒Thread.sleep(1000);System.out.println(Thread.currentThread().getName() + "===>" + i);} catch (InterruptedException e) {throw new RuntimeException(e);}}}}}
测试类:public class RunnableMain {public static void main(String[] args) {// 1、创建实现类对象RunnableImpl runnable = new RunnableImpl();// 2、 创建线程对象,不指定名字Thread t1 = new Thread(runnable,"线程1");// 3、启动线程t1.start();}}
运行结果:文章插图
"善用"sleep年入百万不是梦:
文章插图
yield方法提出申请释放CPU资源,至于能否成功释放取决于JVM决定,调用yield()方法后,线程仍然处于RUNNABLE状态,线程不会进入阻塞状态,保留了随时被调用的权利
实现类:
public class RunnableImpl implements Runnable{@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "开始执行");Thread.yield();System.out.println(Thread.currentThread().getName() + "执行结束");}}
测试类:public class RunnableMain {public static void main(String[] args) {// 1、创建实现类对象RunnableImpl runnable = new RunnableImpl();// 2、 创建线程对象,不指定名字Thread t1 = new Thread(runnable,"线程1");Thread t2 = new Thread(runnable,"线程2");// 3、启动线程t1.start();t2.start();}}
运行结果:第五次执行是线程2执行开始结束后输出的线程1开始结束,这就说明CPU并没有切换到别的线程,说明并没有释放CPU资源
文章插图
join方法将当前的线程挂起,当前线程阻塞,待其他的线程执行完毕,当前线程才能执行,可以把join()方法理解为插队,谁插到前面,谁先执行
在很多情况下,主线程创建并启动子线程,如果子线程中要进行大量的耗时运算,主线程将可能早于子线程结束 。如果主线程需要知道子线程的执行结果时,就需要等待子线程执行结束了 。主线程可以sleep(xx),但这样的xx时间不好确定,因为子线程的执行时间不确定,join()方法比较合适这个场景
public class RunnableMain {public static void main(String[] args) {// 1、lambda创建线程Thread t1 = new Thread(() -> {for (int i = 0; i < 5; i++) {try {// 模拟耗时操作Thread.sleep(1000);System.out.println(Thread.currentThread().getName() + "join方法===>" + i);} catch (InterruptedException e) {throw new RuntimeException(e);}}});// 2、 启动线程t1.start();try {// t1调用join 方法t1.join();} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("main线程");}}
运行结果:文章插图
设置优先级改变、获取线程的优先级 。Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程,线程调度器按照优先级决定应该调度哪个线程来执行 。线程的优先级用数据表示,范围1~10 。线程的优先级高只是表示他的权重大,获取CPU执行权的几率大 。先设置线程的优先级,在执行start()方法
public class RunnableMain {public static void main(String[] args) {// 1、lambda创建线程Thread t1 = new Thread(() -> {System.out.println(Thread.currentThread().getName() + "线程优先级" + Thread.currentThread().getPriority());},"线程1");Thread t2 = new Thread(() -> {System.out.println(Thread.currentThread().getName() + "线程优先级" + Thread.currentThread().getPriority());},"线程2");// 2、设置线程优先级t1.setPriority(1);t2.setPriority(10);// 3、 启动线程t1.start();t2.start();System.out.println("main线程");}}
结束线程JDK提供的【stop()、destroy()】两种方法已废弃,不推荐再使用 。推荐线程自动停止下来,就比如上边的所有案例,都是执行完了run方法中的所有代码之后线程就自然结束了 。如果线程需要循环执行,建议使用一个标识位变量进行终止,当flag=false时,则终止线程运行
推荐阅读
- 广州医养结合的养老院 老年公寓和养老院设计
- 叔本华生平和著作 叔本华的书
- 做好传帮带工作 以身作则团结合作传帮带是什么意思
- 论语是一部什么体的著作 论语是一部什么体散文
- 岳云鹏|岳云鹏相声太无聊?若结合背后安排的用意,就会佩服他的能力
- 长短句的表达效果 长短句结合的作用阅读理解
- 吴承恩人物解析及著作 吴承恩是哪个朝代的小说家
- 王一博|王一博分饰两角舞动双生,国风与街舞的结合,别有一番风味
- 面是什么意思(点面结合的面是什么意思)
- 鹤唳华亭|《鹤唳华亭》,完成率很高,将风格与文学结合在一起