欢迎来到 Java 线程示例。进程线程是两个基本的执行单元。并发编程更关注 java 线程。

进程

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

线程

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

Java 线程示例

java线程实现实例(Java线程示例)(1)

线程示例

每个 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类

我们可以扩展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 类,则不能继承任何其他类。

,