程序员社区

Java 线程 示例详解

进程线程是两个基本的执行单元。

进程

进程是一个自包含的执行环境,它可以被看作是一个程序或应用程序。然而,程序本身包含多个进程。Java 运行时环境作为单个进程运行,其中包含不同的类和程序作为进程。

线程

线程可以称为轻量级进程。线程需要较少的资源来创建并存在于进程中,线程共享进程资源。

Java 线程示例

每个java应用程序至少有一个线程——主线程。虽然在后台运行着很多其他的 java 线程,比如内存管理、系统管理、信号处理等。但是从应用程序的角度来看——main 是第一个 java 线程,我们可以从中创建多个线程。

多线程是指在单个程序中同时执行两个或多个线程。计算机单核处理器一次只能执行一个线程,时间切片是操作系统的特性,可以在不同的进程和线程之间共享处理器时间。

Java 线程的好处

  1. 与进程相比,Java 线程是轻量级的,创建线程所需的时间和资源更少。
  2. 线程共享其父进程数据和代码
  3. 线程之间的上下文切换通常比进程之间的开销低。
  4. 线程间的通信比进程间的通信要容易一些。

Java 提供了两种以编程方式创建线程的方法。

  1. 实现java.lang.Runnable接口。
  2. 扩展java.lang.Thread类。

Java 线程示例——实现 Runnable 接口

为了使类可运行,我们可以实现 java.lang.Runnable 接口并在public void run()方法中提供实现。要将这个类用作Thread,我们需要通过传递这个可运行类的对象来创建一个Thread对象,然后调用方法在单独的线程中start()执行该run()方法。

这是一个通过实现 Runnable 接口的 java 线程示例。

package com.journaldev.threads;

public class HeavyWorkRunnable implements Runnable {

    @Override
    public void run() {
        System.out.println("Doing heavy processing - START "+Thread.currentThread().getName());
        try {
            Thread.sleep(1000);
            //Get database connection, delete unused data from DB
            doDBProcessing();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Doing heavy processing - END "+Thread.currentThread().getName());
    }

    private void doDBProcessing() throws InterruptedException {
        Thread.sleep(5000);
    }

}

Java Thread 示例——扩展 Thread 类

我们可以扩展java.lang.Thread类来创建我们自己的 java 线程类和覆盖run()方法。然后我们可以创建它的对象并调用start()方法来执行我们自定义的java线程类运行方法。

这是一个简单的 java 线程示例,展示了如何扩展 Thread 类。

package com.journaldev.threads;

public class MyThread extends Thread {

    public MyThread(String name) {
        super(name);
    }

    @Override
    public void run() {
        System.out.println("MyThread - START "+Thread.currentThread().getName());
        try {
            Thread.sleep(1000);
            //Get database connection, delete unused data from DB
            doDBProcessing();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("MyThread - END "+Thread.currentThread().getName());
    }

    private void doDBProcessing() throws InterruptedException {
        Thread.sleep(5000);
    }

}

这是一个测试程序,展示了如何创建一个 java 线程并执行它。

package com.journaldev.threads;

public class ThreadRunExample {

    public static void main(String[] args){
        Thread t1 = new Thread(new HeavyWorkRunnable(), "t1");
        Thread t2 = new Thread(new HeavyWorkRunnable(), "t2");
        System.out.println("Starting Runnable threads");
        t1.start();
        t2.start();
        System.out.println("Runnable Threads has been started");
        Thread t3 = new MyThread("t3");
        Thread t4 = new MyThread("t4");
        System.out.println("Starting MyThreads");
        t3.start();
        t4.start();
        System.out.println("MyThreads has been started");

    }
}

上面java线程示例程序的输出是:

Starting Runnable threads
Runnable Threads has been started
Doing heavy processing - START t1
Doing heavy processing - START t2
Starting MyThreads
MyThread - START Thread-0
MyThreads has been started
MyThread - START Thread-1
Doing heavy processing - END t2
MyThread - END Thread-1
MyThread - END Thread-0
Doing heavy processing - END t1

一旦我们启动任何线程,它的执行取决于时间切片的操作系统实现,我们无法控制它们的执行。然而,我们可以设置线程优先级,但即便如此,它也不能保证优先级更高的线程将首先执行。

多次运行上面的程序,你会看到没有线程开始和结束的模式。

可运行与线程

如果您的类提供更多功能而不仅仅是作为 Thread 运行,您应该实现 Runnable 接口以提供一种将其作为 Thread 运行的方法。如果您的类的唯一目标是作为 Thread 运行,您可以扩展 Thread 类。

实现 Runnable 是首选,因为 java 支持实现多个接口。如果扩展 Thread 类,则不能扩展任何其他类。

赞(0) 打赏
未经允许不得转载:IDEA激活码 » Java 线程 示例详解

一个分享Java & Python知识的社区