Java Thread Example

英文原文 : Java Thread Example - Extending Thread Class and Implementing Runnable Interface

程序运行的基础单元就是 进程线程。Java多线程编程主要针对线程。

进程

一个进程有着独立的运行环境,我们可以把进程看作一个程序或者一个应用。进程中包含着若干个线程。JRE会以单个进程的方式启动,但是会包含若干个Class以及线程。

线程

线程可以看作轻量级进程。创建一个线程只需要少量的资源,一个进程中的多个线程可以互相共享进程中的资源。

Java多线程

任何一个Java应用都至少拥有一个线程 -- main thread。当然也有许多运行在后台的线程,诸如:内存管理,系统管理,信号通信管理等等。但一个程序启动都是通过main thread,我们可以通过它来创建多个线程。

多线程是指两个或者两个以上线程同时运行在一个程序中。在单核CPU中,通过分时分片占用CPU的方式来达到多个线程同时运行的效果。

多线程的优点

  1. 相比进程,多线程更加轻量,创建一个线程比创建一个进程花费更少的资源。
  2. 线程可以共享父线程中的资源和字节码。
  3. 多个线程之间的环境转换相比进程开销更小。
  4. 线程之间的相互通信相比进程更加容易。

Java提供两种编程方式创建一个线程

  1. 实现java.lang.Runnable接口。
  2. 继承java.lang.Thread类。

实现Runnable接口创建线程例子

实现Runnable接口并重写其

 public void run();

方法就可以创建一个线程类。若想把这个类当作一个线程运行起来,我们需要通过类对象来创建一个线程对象,然后调用start() 方法,在一个单独的线程来执行run() 方法。

下面是一个实例代码:
HeavyWorkRunnable.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);
    }

}

通过继承Thread类来创建一个线程

我们可以继承java.lang.Thread类,并重写其run() 方法。这样我们可以实例化此类,调用start() 方法来执行run方法中的代码。

例子代码: MyThread.java

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);
    }

}

下面的代码是展示如何执行:ThreadRunExample.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");

    }
}

上面的代码执行结果如下:

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 vs Thread

如果你想使你的程序更加的灵活,那么你最好实现Runnable接口来创建一个线程类。若你只是为了你只是为了创建一个线程这唯一个目的的话,可以使用继承Thread的方法。

由于Java不支持多继承这种情况发生,所以实现Runnable接口可以让你这个类在以后的开发中,继承其他类。

正如你观察的那样,一个线程运行起来的时候, 并不会返回结果,是一个void方法,那如果我们想得到线程运行后返回结果请点击下面的链接Java Callable Future

在最新的Java8中,Runnable类是一个Functional Interface ,我们可以使用Lambda表达式去重写run() 方法而不是使用传统的匿名类的方式。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,447评论 18 399
  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 8,122评论 1 18
  • 下面是我自己收集整理的Java线程相关的面试题,可以用它来好好准备面试。 参考文档:-《Java核心技术 卷一》-...
    阿呆变Geek阅读 15,020评论 14 507
  • 没有过这么失败的旅程 好想哭
    1谷l阅读 1,486评论 0 0
  • 夜,是一个人的 星呢? 是所有的孩子的礼物, 那, 给我一杯金色的阳光或满帆的劲风吧! 等,天明 将遗留下的所有包...
    南纬以北的猫阅读 2,206评论 0 0

友情链接更多精彩内容