java多线程补充
2022/4/8 22:19:45
本文主要是介绍java多线程补充,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
java多线程
【狂神说Java】多线程详解哔哩哔哩bilibili
深入浅出线程Thread类的start()方法和run()方法 - 简书 (jianshu.com)
1.初见
java的线程是通过java.lang.Thread
类来实现的。每个线程都是通过某个特定Thread对象所对应的方法run()
来完成其操作的,方法run()称为线程体。通过调用Thread类的start()
方法来启动一个线程。
狂神的两个小demo
demo01
第一个建立线程的方法
package com.kuang; public class demo01 extends Thread{ @Override //run方法可以理解为简单的一个函数并没有什么实际作用 public void run() { for (int i = 0; i < 20; i++) { System.out.println("run-----" + i); } } public static void main(String[] args) { demo01 demo01 = new demo01(); //start()方法是启动这个线程 demo01.start(); for (int i = 0; i < 2000; i++) { System.out.println("主线程---" + i); } } }
demo02
用Runable接口来实现
package com.kuang; public class demo02 implements Runnable{ @Override public void run() { for (int i = 0; i < 20; i++) { System.out.println("线程" + i); } } public static void main(String[] args) { //线程代理 demo02 demo02 = new demo02(); Thread thread = new Thread(demo02); thread.start(); for (int i = 0; i < 20; i++) { System.out.println("学习多线程 -------------" + i); } } }
通过分析源码可以看出来
Thread继承了Runable的接口
Runable接口实现了run()方法
但是你的Thread才是线程,不能直接用Runable直接测试run方法,还得通过Thread来进行测试
demo03
发现并发问题
一共5张票,但是三个人抢的话,都会遍历一个遍
package com.kuang; public class demo03 implements Runnable{ /** * 通过买票发现并发问题 */ @Override public void run() { for (int i = 1; i <= 5; i++) { System.out.println(Thread.currentThread().getName() + "抢到了第" + i + "票"); } } public static void main(String[] args) { demo03 demo03 = new demo03(); new Thread(demo03,"小米").start(); new Thread(demo03,"小红").start(); new Thread(demo03,"黄牛").start(); } }
结果:
小红抢到了第1票 黄牛抢到了第1票 小米抢到了第1票 黄牛抢到了第2票 小红抢到了第2票 黄牛抢到了第3票 小米抢到了第2票 黄牛抢到了第4票 黄牛抢到了第5票 小红抢到了第3票 小米抢到了第3票 小红抢到了第4票 小米抢到了第4票 小红抢到了第5票 小米抢到了第5票
显然不符合要求
demo04
利用多线程解决龟兔赛跑
package com.kuang; public class demo04 implements Runnable{ @Override public void run() { for (int i = 0; i <= 100; i++) { System.out.println(Thread.currentThread().getName() + "跑了" + i + "米"); if(win(i)){ break; } if (Thread.currentThread().getName().equals("兔子") && i % 10 == 0 ) { try { //模拟兔子休息 Thread.sleep(20000); } catch (InterruptedException e) { e.printStackTrace(); } } } } public boolean win(int step) { if(step == 100) { System.out.println(Thread.currentThread().getName() + "获胜"); return true; } return false; } public static void main(String[] args) { demo04 demo04 = new demo04(); new Thread(demo04,"
这篇关于java多线程补充的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-13TiDB + ES:转转业财系统亿级数据存储优化实践
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了
- 2024-05-09Google Chrome驱动程序 124.0.6367.62(正式版本)去哪下载?
- 2024-05-09有没有大佬知道这种数据应该怎么抓取呀?
- 2024-05-09这种运行结果里的10.100000001,怎么能最快改成10.1?
- 2024-05-09企业src漏洞挖掘-有意思的命令执行