Thread1

本文详细解释了Java中多线程的基本概念与工作原理。通过start()方法启动线程,使其进入就绪状态,等待CPU调度执行run()方法。直接调用run()则无法实现真正的多线程并发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多线程原理:相当于玩游戏机,只有一个游戏机(cpu),可是有很多人要玩,于是,start是排队!等CPU选中你就是轮到你,你就run(),当CPU的运行的时间片执行完,这个线程就继续排队,等待下一次的run()。

调用start()后,线程会被 放到等待队列,等待CPU调度, 并不一定要马上开始执行,只是将这个线程置于可动行状态。然后通过JVM,线程Thread会调用run()方法,执行本线程的线程体。先调用start后调用run,这么麻烦,为了不直接调用run?就是为了实现多线程的优点,没这个start不行。

1. start()方法来启动线程,真正实现了多线程运行。这时无需等待run方法体代码执行完毕,可以直接继续执行下面的代码;通过调用Thread类的start()方法来启动一个线程, 这时此线程是处于就绪状态, 并没有运行。 然后通过此Thread类调用方法run()来完成其运行操作的, 这里方法run()称为线程体,它包含了要执行的这个线程的内容, Run方法运行结束, 此线程终止。然后CPU再调度其它线程。
2. run()方法当作普通方法的方式调用。程序还是要顺序执行,要等待run方法体执行完毕后,才可继续执行下面的代码; 程序中只有主线程——这一个线程, 其程序执行路径还是只有一条, 这样就没有达到写线程的目的。

记住:多线程就是分时利用CPU,宏观上让所有线程一起执行 ,也叫并发

  1. public class Test {  
  2.     public static void main(String[] args) {  
  3.         Runner1 runner1 = new Runner1();  
  4.         Runner2 runner2 = new Runner2();  
  5. //      Thread(Runnable target) 分配新的 Thread 对象。  
  6.         Thread thread1 = new Thread(runner1);  
  7.         Thread thread2 = new Thread(runner2);  
  8. //      thread1.start();  
  9. //      thread2.start();  
  10.         thread1.run();  
  11.         thread2.run();  
  12.     }  
  13. }  
  14.   
  15. class Runner1 implements Runnable { // 实现了Runnable接口,jdk就知道这个类是一个线程  
  16.     public void run() {  
  17.         for (int i = 0; i < 100; i++) {  
  18.             System.out.println("进入Runner1运行状态——————————" + i);  
  19.         }  
  20.     }  
  21. }  
  22.   
  23. class Runner2 implements Runnable { // 实现了Runnable接口,jdk就知道这个类是一个线程  
  24.     public void run() {  
  25.         for (int i = 0; i < 100; i++) {  
  26.             System.out.println("进入Runner2运行状态==========" + i);  
  27.         }  
  28.     }  

`thread1.join();` 是 Java 中用于线程同步的一个方法。它的作用是让当前线程(主线程)等待 `thread1` 执行完毕后再继续执行。 ### 示例代码 以下是一个简单的例子,展示如何使用 `join()` 方法: ```java public class JoinExample { public static void main(String[] args) throws InterruptedException { Thread thread1 = new Thread(() -> { for (int i = 0; i < 5; i++) { System.out.println("Thread 1: " + i); try { Thread.sleep(100); // 让线程休眠100毫秒 } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } }); Thread thread2 = new Thread(() -> { for (int i = 0; i < 5; i++) { System.out.println("Thread 2: " + i); try { Thread.sleep(100); // 让线程休眠100毫秒 } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } }); thread1.start(); thread1.join(); // 主线程等待 thread1 执行完毕 thread2.start(); thread2.join(); // 主线程等待 thread2 执行完毕 System.out.println("All threads have finished execution."); } } ``` ### 解释 - **`thread1.start();`** 启动 `thread1` 线程,使其开始执行任务。 - **`thread1.join();`** 当前线程(这里是主线程)会阻塞,直到 `thread1` 执行完毕。这意味着主线程会等待 `thread1` 完成所有操作后,才会继续执行后续代码。 - **`thread2.start();` 和 `thread2.join();`** 类似地,启动 `thread2` 并让主线程等待其完成。 - **输出顺序** 因为使用了 `join()` 方法,所以 `thread1` 的输出会在 `thread2` 之前完成,确保线程按顺序执行。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值