【狂神说Java】多线程详解哔哩哔哩bilibili
深入浅出线程Thread类的start()方法和run()方法 - 简书 (jianshu.com)
java的线程是通过java.lang.Thread
类来实现的。每个线程都是通过某个特定Thread对象所对应的方法run()
来完成其操作的,方法run()称为线程体。通过调用Thread类的start()
方法来启动一个线程。
狂神的两个小demo
第一个建立线程的方法
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); } } }
用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来进行测试
发现并发问题
一共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票
显然不符合要求
利用多线程解决龟兔赛跑
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,"