Java线程示例

时间:2020-02-23 14:36:57  来源:igfitidea点击:

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

进程

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

线程

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

Java线程示例

每个Java应用程序都有至少一个线程–主线程。
尽管还有很多其他Java线程在后台运行,例如内存管理,系统管理,信号处理等。
但是从应用程序角度来看,main是第一个Java线程,我们可以从中创建多个线程。

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

Java线程的好处

  • 与进程相比,Java线程轻巧,创建线程所需的时间和资源更少。

  • 线程共享其父流程数据和代码

  • 在线程之间进行上下文切换通常比在进程之间便宜。

  • 线程相互通信比过程通信相对容易。

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

  • 实现java.lang.Runnable接口。

  • 扩展java.lang.Thread类。

Java线程示例–实现Runnable接口

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

这是通过实现Runnable接口的Java线程示例。

package com.theitroad.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线程示例–扩展线程类

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

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

package com.theitroad.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.theitroad.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

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

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

可运行与线程

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

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