菜单
×
   ❮     
HTML CSS JAVASCRIPT SQL PYTHON JAVA PHP HOW TO W3.CSS C C++ C# BOOTSTRAP REACT MYSQL JQUERY EXCEL XML DJANGO NUMPY PANDAS NODEJS R TYPESCRIPT ANGULAR GIT POSTGRESQL MONGODB ASP AI GO KOTLIN SASS VUE DSA GEN AI SCIPY AWS CYBERSECURITY DATA SCIENCE
     ❯   

Java 教程

Java HOME Java Intro Java Get Started Java Syntax Java Output Java Comments Java Variables Java Data Types Java Type Casting Java Operators Java Strings Java Math Java Booleans Java If...Else Java Switch Java While Loop Java For Loop Java Break/Continue Java Arrays

Java Methods

Java Methods Java Method Parameters Java Method Overloading Java Scope Java Recursion

Java Classes

Java 面向对象编程 Java 类/对象 Java 类属性 Java 类方法 Java 构造函数 Java 修饰符 Java 封装 Java 包 / API Java 继承 Java 多态 Java 内部类 Java 抽象 Java 接口 Java 枚举 Java 用户输入 Java 日期 Java ArrayList Java LinkedList Java 列表排序 Java HashMap Java HashSet Java 迭代器 Java 包装类 Java 异常 Java 正则表达式 Java 线程 Java Lambda Java 高级排序

Java File Handling

Java Files Java Create/Write Files Java Read Files Java Delete Files

Java How To's

两数相加 单词计数 反转字符串 数组元素求和 字符串转数组 数组排序 查找数组平均值 查找最小元素 ArrayList 循环 HashMap 循环 遍历枚举 矩形面积 偶数或奇数 正数或负数 平方根 随机数

Java 参考

Java Reference Java Keywords Java String Methods Java Math Methods Java Output Methods Java Arrays Methods Java ArrayList Methods Java LinkedList Methods Java HashMap Methods Java Scanner Methods Java Iterator Methods Java Errors & Exceptions

Java 示例

Java Examples Java Compiler Java Exercises Java Quiz Java Server Java Certificate


Java 线程


Java 线程

线程允许程序通过同时执行多个任务来更高效地运行。

线程可用于在后台执行复杂的任务,而不会中断主程序。


创建线程

创建线程有两种方式。

可以通过扩展 Thread 类并覆盖其 run() 方法来创建线程

扩展语法

public class Main extends Thread {
  public void run() {
    System.out.println("This code is running in a thread");
  }
}

创建线程的另一种方式是实现 Runnable 接口

实现语法

public class Main implements Runnable {
  public void run() {
    System.out.println("This code is running in a thread");
  }
}

运行线程

如果类扩展了 Thread 类,可以通过创建该类的实例并调用其 start() 方法来运行线程

扩展示例

public class Main extends Thread {
  public static void main(String[] args) {
    Main thread = new Main();
    thread.start();
    System.out.println("This code is outside of the thread");
  }
  public void run() {
    System.out.println("This code is running in a thread");
  }
}

自己动手试一试 »

如果类实现了 Runnable 接口,可以通过将该类的实例传递给 Thread 对象的构造函数,然后调用线程的 start() 方法来运行线程

实现示例

public class Main implements Runnable {
  public static void main(String[] args) {
    Main obj = new Main();
    Thread thread = new Thread(obj);
    thread.start();
    System.out.println("This code is outside of the thread");
  }
  public void run() {
    System.out.println("This code is running in a thread");
  }
}

自己动手试一试 »

“扩展”和“实现”线程之间的区别

主要区别在于,当一个类扩展 Thread 类时,您不能扩展任何其他类,但通过实现 Runnable 接口,也可以扩展其他类,例如:class MyClass extends OtherClass implements Runnable


并发问题

由于线程与其他程序部分同时运行,因此无法知道代码将以何种顺序运行。当线程和主程序读写相同的变量时,这些值是不可预测的。由此产生的问题称为并发问题。

示例

一个变量 amount 的值不可预测的代码示例

public class Main extends Thread {
  public static int amount = 0;

  public static void main(String[] args) {
    Main thread = new Main();
    thread.start();
    System.out.println(amount);
    amount++;
    System.out.println(amount);
  }

  public void run() {
    amount++;
  }
}

自己动手试一试 »

为了避免并发问题,最好在线程之间尽可能少地共享属性。如果需要共享属性,一种可能的解决方案是在使用线程可能更改的任何属性之前,使用线程的 isAlive() 方法检查线程是否已完成运行。

示例

使用 isAlive() 防止并发问题

public class Main extends Thread {
  public static int amount = 0;

  public static void main(String[] args) {
    Main thread = new Main();
    thread.start();
    // Wait for the thread to finish
    while(thread.isAlive()) {
      System.out.println("Waiting...");
    }
    // Update amount and print its value
    System.out.println("Main: " + amount);
    amount++;
    System.out.println("Main: " + amount);
  }
  public void run() {
    amount++;
  }
}

自己动手试一试 »




×

联系销售

如果您想将 W3Schools 服务用于教育机构、团队或企业,请发送电子邮件给我们
sales@w3schools.com

报告错误

如果您想报告错误,或想提出建议,请发送电子邮件给我们
help@w3schools.com

W3Schools 经过优化,旨在方便学习和培训。示例可能经过简化,以提高阅读和学习体验。教程、参考资料和示例会不断审查,以避免错误,但我们无法保证所有内容的完全正确性。使用 W3Schools 即表示您已阅读并接受我们的使用条款Cookie 和隐私政策

版权所有 1999-2024 Refsnes Data。保留所有权利。W3Schools 由 W3.CSS 提供支持