线程管理(一)线程的创建和运行

简介:

线程的创建和运行

在这个指南中,我们将学习如何在Java程序中创建和运行线程。与每个Java语言中的元素一样,线程是对象。在Java中,我们有2个方式创建线程:

  • 通过直接继承thread类,然后覆盖run()方法。
  • 构建一个实现Runnable接口的类, 然后创建一个thread类对象并传递Runnable对象作为构造参数

在这个指南中,我们将使用第二种方法来制作一个简单的程序,它能创建和运行10个线程。每一个线程能计算和输出1-10以内的乘法表。

准备
指南中的例子是使用Eclipse IDE 来实现的。如果你使用Eclipse 或者其他的IDE,例如NetBeans, 打开并创建一个新的java项目。

怎么做呢

按照这些步骤来实现下面的例子:

1.     创建一个名为Calculator的类,这个类要实现Runnable接口。


1 public class Calculator implements Runnable {

2.   声明一个名为number 的private int为属性,然后实现构造函数并初始化其值。


1 private int number;
2 public Calculator(int number) {
3     this.number=number;
4 }

3.   实现run()方法. 这方法是给我们创建的线程执行指令,所以这个方法将计算数字乘法表。


1 @Override
2 public void run() {
3   for (int i=1; i<=10; i++){
4    System.out.printf("%s: %d * %d = %d\n",Thread.currentThread().getName(),number,i,i*number);
5 }
6 }

4.   现在, 实现程序的Main类。创建一个名为 Main的类并包含 main() 方法.


1 public class Main {
2     public static void main(String[] args) {

5.   在 main() 方法内,创建一个迭代10次的for循环。在每次循环中,创建一个 Calculator 类的对象,  一个Thread类的对象, 然后传递 Calculator 对象作为thread类构造函数的参数,最后调用线程对象的start() 方法。


1 for (int i=1; i<=10; i++){
2    Calculator calculator=new Calculator(i); Thread thread=new Thread(calculator);
3    thread.start();
4 }

6.   运行程序并观察不同的线程是如何并行工作的。

它是怎么工作的

接下来是部分的程序输出的裁图。我们可以查看全部创建的线程,并行地运行, 见下图:
1-1

每个Java程序最少有一个执行线程。当你运行程序的时候, JVM运行负责调用main()方法的执行线程。

当调用Thread对象的start()方法时, 我们创建了另一个执行线程。在这些start()方法调出后,我们的程序就有了多个执行线程。

当全部的线程执行结束时(更具体点,所有非守护线程结束时),Java程序就结束了。如果初始线程(执行main()方法的主线程)运行结束,其他的线程还是会继续执行直到执行完成。但是如果某个线程调用System.exit()指示终结程序,那么全部的线程都会结束执行。

创建一个Thread类的对象不会创建新的执行线程。同样,调用实现Runnable接口的 run()方法也不会创建一个新的执行线程。只有调用start()方法才能创建一个新的执行线程。

更多

在介绍这个指南时我们提到还有另一种方法可以创建新的执行线程。你可以实现一个类,这个类扩展Thread类并覆盖它的run()方法。接着,你就可以从这个类创建一个对象并调用start()方法来创建一个新的执行线程。

参见

  • 第一章,线程管理:通过创建工厂创建线程
目录
相关文章
|
5月前
|
Java 测试技术 API
【JUC】(1)带你重新认识进程与线程!!让你深层次了解线程运行的睡眠与打断!!
JUC是什么?你可以说它就是研究Java方面的并发过程。本篇是JUC专栏的第一章!带你了解并行与并发、线程与程序、线程的启动与休眠、打断和等待!全是干货!快快快!
802 2
|
编解码 网络协议 API
Netty运行原理问题之Netty的主次Reactor多线程模型工作的问题如何解决
Netty运行原理问题之Netty的主次Reactor多线程模型工作的问题如何解决
154 1
|
Java Spring
运行@Async注解的方法的线程池
自定义@Async注解线程池
586 3
|
消息中间件 设计模式 安全
多线程魔法:揭秘一个JVM中如何同时运行多个消费者
【8月更文挑战第22天】在Java虚拟机(JVM)中探索多消费者模式,此模式解耦生产与消费过程,提升系统性能。通过`ExecutorService`和`BlockingQueue`构建含2个生产者及4个消费者的系统,实现实时消息处理。多消费者模式虽增强处理能力,但也引入线程安全与资源竞争等挑战,需谨慎设计以确保高效稳定运行。
232 2
|
安全 开发者
LabVIEW程序退出后线程仍在运行问题
LabVIEW程序退出后线程仍在运行问题
389 2
|
Java 程序员
Java多线程编程是指在一个进程中创建并运行多个线程,每个线程执行不同的任务,并行地工作,以达到提高效率的目的
【6月更文挑战第18天】Java多线程提升效率,通过synchronized关键字、Lock接口和原子变量实现同步互斥。synchronized控制共享资源访问,基于对象内置锁。Lock接口提供更灵活的锁管理,需手动解锁。原子变量类(如AtomicInteger)支持无锁的原子操作,减少性能影响。
129 3
|
Dart Serverless Android开发
Flutter 单线程模型保证UI运行流畅
Flutter 单线程模型保证UI运行流畅
429 0
|
Go 调度
|
监控 安全
线程死循环是多线程应用程序开发过程中一个难以忽视的问题,它源于线程在执行过程中因逻辑错误或不可预见的竞争状态而陷入永久运行的状态,严重影响系统的稳定性和资源利用率。那么,如何精准定位并妥善处理线程死循环现象,并在编码阶段就规避潜在风险呢?谈谈你的看法~
避免线程死循环的关键策略包括使用同步机制(如锁和信号量)、减少共享可变状态、设置超时、利用监控工具、定期代码审查和测试、异常处理及设计简洁线程逻辑。通过这些方法,可降低竞态条件、死锁风险,提升程序稳定性和可靠性。
295 0

热门文章

最新文章