多线程1
1.通过继承Thread类方法创建线程

class Cat extends Thread { int times = 0; @Override public void run() {//重写run方法,写上自己的业务逻辑 while (true) { //该线程每隔1秒。在控制台输出 “喵喵, 我是小猫咪” System.out.println("喵喵, 我是小猫咪" + (++times) + " 线程名=" + Thread.currentThread().getName()); //让该线程休眠1秒 ctrl+alt+t try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } if(times == 80) { break;//当times 到80, 退出while, 这时线程也就退出.. } } } }
主函数
//创建Cat对象,可以当做线程使用 Cat cat = new Cat(); cat.start(); //启动线程-> 最终会执行cat的run方法
为什么不直接调用cat.run()?
因为这样的话就缺少了中间的一系列过程, 这个"线程"就变成了主线程也就是main, run()方法只是一个普通的方法,用的话就是平常的串行,而不是多线程.
start()的源码 [关键] /* (1) public synchronized void start() { start0(); //最关键的 } (2) //start0() 是本地方法,是JVM调用, 底层是c/c++实现 //真正实现多线程的效果, 是start0(), 而不是 run private native void start0(); */
2.通过Runnable接口来创建线程(解决JAVA单继承无法用第一种方法来创建线程的问题)

public class Thread1 { public static void main(String[] args) throws InterruptedException { Dog dog = new Dog(); //dog.start(); 这里不能调用start //创建了Thread对象,把 dog对象(实现Runnable),放入Thread Thread thread = new Thread(dog); thread.start(); System.out.println("主线程继续执行" + Thread.currentThread().getName());//名字main for(int i = 0; i < 60; i++) { System.out.println("主线程 i=" + i); //让主线程休眠 Thread.sleep(1000); } } } class Dog implements Runnable { //通过实现Runnable接口,开发线程 int count = 0; @Override public void run() { //普通方法 while (true) { System.out.println("小狗汪汪叫..hi" + (++count) + Thread.currentThread().getName()); //休眠1秒 try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } if (count == 10) { break; } } } }
可能遇到的问题:
多线程买票,导致票量溢出
解决方法:
利用线程退出机制:
线程的通知方式(终结)

public class ThreadExit_ { public static void main(String[] args) throws InterruptedException { T t1 = new T(); t1.start(); //如果希望main线程去控制t1 线程的终止, 必须可以修改 loop //让t1 退出run方法,从而终止 t1线程 -> 通知方式 //让主线程休眠 10 秒,再通知 t1线程退出 System.out.println("main线程休眠10s..."); Thread.sleep(10 * 1000); t1.setLoop(false); } } class T extends Thread { private int count = 0; //设置一个控制变量 private boolean loop = true; @Override public void run() { while (loop) { try { Thread.sleep(50);// 让当前线程休眠50ms } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("T 运行中...." + (++count)); } } public void setLoop(boolean loop) { this.loop = loop; } }
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术