【JavaSE专栏77】线程的创建和启动,继承Thread类或实现Runnable接口完成线程创建启动

简介: 【JavaSE专栏77】线程的创建和启动,继承Thread类或实现Runnable接口完成线程创建启动

本文讲解了 Java 中线程的创建和启动的方式,并给出了样例代码。进程是指正在运行的一个程序的执行实例,它是操作系统进行资源分配和调度的基本单位,每个进程都有自己的内存空间、文件描述符、运行时环境等,进程之间是相互独立的,彼此之间不共享内存空间。

一、什么是进程和线程

在 Java 中,进程是指正在运行的一个程序的执行实例,它是操作系统进行资源分配和调度的基本单位,每个进程都有自己的内存空间、文件描述符、运行时环境等,进程之间是相互独立的,彼此之间不共享内存空间。

线程是进程内的一个执行路径,一个进程可以包含多个线程,这些线程共享进程的内存空间和其他资源,线程是执行计算机程序的最小单位,它可以独立执行任务,也可以协作合作与其他线程共同完成任务,线程之间的调度和切换由操作系统的线程调度器负责。

与进程相比,线程的创建和销毁开销较小,切换速度也较快,线程之间可以共享同一个进程的数据,因此线程之间的通信更加方便。多线程的并发执行可以提高程序的效率和响应速度。

总结起来,进程是操作系统进行资源调度的基本单位,而线程是进程内的一个执行路径,是执行计算机程序的最小单位,在 Java 中可以使用多线程来实现并发编程,提高程序的性能和响应能力。


二、线程如何创建

在 Java 中,有两种方式可以创建线程,请同学们认真学习。

2.1 继承Thread类并重写run()方法

public class MyThread extends Thread {
    @Override
    public void run() {
        // 线程执行的任务
        System.out.println("Thread is running");
    }
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start(); // 启动线程
    }
}

2.2 实现Runnable接口并实现run()方法

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        // 线程执行的任务
        System.out.println("Thread is running");
    }
    public static void main(String[] args) {
        MyRunnable runnable = new MyRunnable();
        Thread thread = new Thread(runnable);
        thread.start(); // 启动线程
    }
}

这两种方式都可以用来创建线程,但推荐同学们使用第二种方式,即实现 Runnable 接口,这是因为 Java是单继承的,如果已经继承了其他类,就无法再继承 Thread 类,而实现 Runnable 接口没有这个限制,还可以更好地实现代码的解耦

无论使用哪种方式创建线程,最终都需要调用 start() 方法来启动线程,使其进入就绪状态,等待被调度执行,在 run() 方法中编写线程的具体执行逻辑,通过创建线程对象并启动线程,可以实现多线程的并发执行。


三、线程如何启动

在 Java 中,要启动一个线程,需要创建一个线程对象,并调用其 start() 方法来启动线程。下面是一个简单的示例代码,请同学们复制到本地执行。

public class MyThread extends Thread {
    @Override
    public void run() {
        // 线程执行的任务
        System.out.println("Thread is running");
    }
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start(); // 启动线程
    }
}

在示例代码中,我们创建了一个继承自Thread类的MyThread类,并重写了其run()方法。在run()方法中编写了线程的具体执行逻辑。在main()方法中,我们创建了一个MyThread对象,并调用start()` 方法来启动线程。

只有调用了 start() 方法,线程才会进入就绪状态,等待被调度执行。直接调用 run() 方法只会在当前线程中以普通方法的方式执行,并不会启动新的线程。

通过创建线程对象并启动线程,我们可以实现多线程的并发执行,每个线程都是独立执行的,具有自己的执行路径和堆栈,从而实现并行处理和提高程序的性能和响应能力。


四、线程的应用场景

Java 线程在许多应用场景中都有广泛的应用,以下是一些常见的应用场景,请同学们认真学习。

  1. 并发编程:Java 线程用于实现并发编程,允许多个任务在同一时间段内同时执行,提高程序的性能和响应能力,可以使用多线程来处理大量的并行任务,例如在服务器中处理多个客户端请求、Web服务器请求、多线程爬虫等。
  2. 后台任务:Java 线程可以用于执行后台任务,例如在后台更新数据、发送邮件、定时任务调度等。
  3. 图形用户界面应用程序:在图形用户界面应用程序中,Java 线程用于处理用户交互事件、更新界面显示等任务,以保持界面的流畅和响应。
  4. 多线程计算:Java 线程可用于并行计算任务,将大型计算任务划分为多个子任务,每个子任务由一个独立的线程来执行,从而提高计算效率。
  5. 线程池:线程池是一种常见的线程管理机制,Java 提供了 ThreadPoolExecutor 类来实现线程池,线程池可以重复利用线程,避免频繁创建和销毁线程的开销,提高系统的性能和资源利用率。
  6. 异步编程:Java 线程可以用于实现异步编程,例如通过 FutureCompletableFuture 等机制实现异步调用和响应。
  7. 并行排序和搜索:Java 线程可以用于实现并行排序和搜索算法,将任务划分为多个子任务,每个子任务由一个独立的线程来执行,从而提高排序和搜索的效率。

总结起来,Java 线程在并发编程、后台任务处理、GUI 应用程序、多线程计算、线程池、异步编程、并行排序和搜索等各种应用场景中都具有重要的作用,通过合理地应用线程,能够提高程序的性能、响应能力和资源利用率。


五、线程面试题

  1. 什么是线程?
  2. 线程与进程的区别是什么?
  3. Java 中如何创建线程?
  4. 什么是线程安全?如何确保线程安全?
  5. 线程的生命周期是怎样的?
  6. sleep() 方法和 wait() 方法的区别是什么?
  7. 什么是线程池?如何使用线程池?
  8. synchronizedvolatile 关键字有什么区别?
  9. 什么是线程死锁?如何避免线程死锁?
  10. 什么是线程间通信?如何实现线程间通信?
  11. Java 中的线程调度是如何工作的?
  12. 什么是守护线程?
  13. Java 中有哪些线程同步机制?
  14. 什么是线程安全的集合类?举例说明。
  15. 什么是线程优先级?如何设置线程优先级?

六、总结

本文讲解了 Java 中线程的创建和启动的方式,并给出了样例代码,在下一篇博客中,将讲解 Java 线程同步用法。


相关文章
|
1天前
|
Java
【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
9 0
|
1天前
|
Java API 调度
【Java多线程】Thread类的基本用法
【Java多线程】Thread类的基本用法
5 0
|
3天前
|
算法 安全 调度
【C++入门到精通】 线程库 | thread类 C++11 [ C++入门 ]
【C++入门到精通】 线程库 | thread类 C++11 [ C++入门 ]
12 1
|
1天前
|
设计模式 消息中间件 安全
【Java多线程】关于多线程的一些案例 —— 单例模式中的饿汉模式和懒汉模式以及阻塞队列
【Java多线程】关于多线程的一些案例 —— 单例模式中的饿汉模式和懒汉模式以及阻塞队列
8 0
|
1天前
|
Java 数据库
【Java多线程】对线程池的理解并模拟实现线程池
【Java多线程】对线程池的理解并模拟实现线程池
9 1
|
1天前
|
Java
【Java多线程】分析线程加锁导致的死锁问题以及解决方案
【Java多线程】分析线程加锁导致的死锁问题以及解决方案
9 1
|
1天前
|
存储 缓存 安全
【Java多线程】线程安全问题与解决方案
【Java多线程】线程安全问题与解决方案
8 1
|
1天前
|
Java 调度
【Java多线程】线程中几个常见的属性以及状态
【Java多线程】线程中几个常见的属性以及状态
7 0
|
1天前
|
Java 调度
【Java多线程】对进程与线程的理解
【Java多线程】对进程与线程的理解
9 1
|
3天前
|
存储 安全 Java
【探索Linux】P.21(多线程 | 线程同步 | 条件变量 | 线程安全)
【探索Linux】P.21(多线程 | 线程同步 | 条件变量 | 线程安全)
9 0