Java线程演示样例 - 继承Thread类和实现Runnable接口

进程(Process)线程(Thread)是程序执行的两个基本单元。

Java并发编程很多其它的是和线程相关。

进程

进程是一个独立的执行单元,可将其视为一个程序或应用。然而,一个程序内部同事还包括多个进程。

Java执行时环境就是一个单独的进程,在它内部还包括了作为进程的各种类和程序。

线程

能够将线程看做轻量级的进程。

线程存在于进程其中,须要的资源开销较小。同一进程中的线程共享进程的资源。

Java多线程

每个Java引用都仅仅要有一个线程 - 主线程(main thread)。尽管后台还执行着更多的线程,如内存管理、系统管理、信号处理等等,可是从应用程序的角度来讲,main是第一个线程,我们能够从它開始创建多个线程。

线程的长处

1. 与进程相比,线程时轻量级的。创建线程的时间开销和资源开销都非常小。

2. 同一进程的线程共享进程的数据和代码。

3. 线程间上下文切换的开销通常小于进程。

4. 与进程间通信相比,线程间通信更为方便。

在编程中。Java提供了两种创建线程的方式:

1. 实现java.lang.Runnable接口

2. 继承java.lang.Thread类

Java线程演示样例 - 实现Runnable接口

为了使类能执行,我们须要实现java.lang.Runnable接口,并在public void run()方法中提供实现。同一时候。还须要创建一个Thread对象,并将实现了Runnable接口的类作为參数闯入,这样才干调用start()在一个独立的线程中执行run()

以下就是一个实现了Runnable接口的Java类。

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

Java线程演示样例 - 继承Thread类

能够通过集成java.lang.Thread类并重写run()方法来创建自己的线程类。我们能够创建线程类的对象,并调用start()方法来运行定义好的run方法。

以下的样例演示了怎样集成Thread类。

MyThread.java

package com.journaldev.threads;

public class MyThread extends Thread {

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

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

以下的測试程序演示了怎样创建并运行线程。

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"):
    }
}

上面的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

假设你的类不只作为一个线程来执行,而是须要提供很多其它的功能,那么,你就应该实现Runnable接口。假设你的类的目标只不过作为线程来执行。你能够直接继承Thread类。

相比继承Thread类,实现Runnable接口更好一些,由于Java支持多接口实现。一旦你的类继承了Thread类。那它就无法再继承其它类了。

技巧:你可能注意到了。线程并不返回不论什么值。但假设我们希望线程在完毕处理工作后能返回处理结果给客户程序的话。能够參考文章《Java Callable Future》

更新:从Java 8開始,Runnable议程诚意一个功能性接口。我们能够使用lambda表达式来实现它,而非使用匿名类。详情请见《Java 8 Lambda Expressions Tutorial》

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

时间: 2024-10-26 10:43:18

Java线程演示样例 - 继承Thread类和实现Runnable接口的相关文章

Java线程示例 - 继承Thread类和实现Runnable接口

进程(Process)和线程(Thread)是程序运行的两个基本单元.Java并发编程更多的是和线程相关. 进程 进程是一个独立的执行单元,可将其视为一个程序或应用.然而,一个程序内部同事还包含多个进程.Java运行时环境就是一个单独的进程,在它内部还包含了作为进程的各种类和程序. 线程 可以将线程看做轻量级的进程.线程存在于进程当中,需要的资源开销较小.同一进程中的线程共享进程的资源. Java多线程 每一个Java引用都只要有一个线程 - 主线程(main thread).虽然后台还运行着许

Java中继承thread类与实现Runnable接口的区别

Java中线程的创建有两种方式: 1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2.  通过实现Runnable接口,实例化Thread类 在实际应用中,我们经常用到多线程,如车站的售票系统,车站的各个售票口相当于各个线程.当我们做这个系统的时候可能会想到两种方式来实现,继承Thread类或实现Runnable接口,现在看一下这两种方式实现的两种结果. Java代码   package com.threadtest; class MyThread e

Java基础知识强化之多线程笔记05:Java中继承thread类 与 实现Runnable接口的区别

1. Java中线程的创建有两种方式:  (1)通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中. (2)通过实现Runnable接口,实例化Thread类. 2. 在实际应用中,我们经常用到多线程,如车站的售票系统,车站的各个售票口相当于各个线程.当我们做这个系统的时候可能会想到两种方式来实现,继承Thread类或实现Runnable接口,现在看一下这两种方式实现的两种结果. 继承thread类 1 package com.threadtest; 2 clas

Java中实现多线程继承Thread类与实现Runnable接口的区别

Java中线程的创建有两种方式: 1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2.  通过实现Runnable接口,实例化Thread类 在实际应用中,我们经常用到多线程,如车站的售票系统,车站的各个售票窗口相当于各个线程.当我们做这个系统的时候可能会想到两种方式来实现,继承Thread类或实现Runnable接口,现在看一下这两种方式实现的两种结果. 一:继承Thread类的方式 Java代码 package com.threadtest; cl

实现多线程的两种方法:继承Thread类或实现Runnable接口

实现多线程的两种方法:继承Thread类或实现Runnable接口 Java中实现多线程有两种方法:继承Thread类和实现Runnable接口,在程序开发中只要是多线程,我们一般都是实现Runnable接口,原因归结为一点:实现接口比继承类要好. 多线程的第一种实现方式:继承Thread类 步骤如下 创建一个继承Thread的类(假定为A),并重写Thread的run方法 构造一个A类对象,假定为aa 调用aa的start方法.(start方法是从Thread继承过来的) 具体例子如下 pac

Java通过继承thread类与实现Runnable接口实现多线程的区别

Java中线程的创建有两种方式: 1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2.  通过实现Runnable接口,实例化Thread类 一.通过继承Thread类实现多线程 class MyThread extends Thread{ String name = null; int ticket = 0; public MyThread(String name){ this.name = name; } public synchronized v

【多线程学习记录一(2)】继承Thread类和实现Runnable接口、Callable接口的区别

1)Runnable和Callable同是接口 * Callable的任务执行后可返回值,而Runnable的任务是不能返回值(是void);call方法可以抛出异常,run方法不可以 * 运行Callable任务可以拿到一个Future对象,表示异步计算的结果.它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果.通过Future对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果. * 加入线程池运行,Runnable使用ExecutorService的execute方

java设计模式演示样例

创建模式 1.工厂方法模式(Factory Method)  将程序中创建对象的操作,单独出来处理,创建一个产品的工厂接口,把实际的工作转移到详细的子类.大大提高了系统扩展的柔性,接口的抽象化处理给相互依赖的对象创建提供了最好的抽象模式. public class TestFactoryMethod { public static void main(String[] args) { AnimalFactory af=new DogFactory(); Animal1 a=af.getAnima

Java多线程实现1,继承Thread类

Java可以通过继承Thread类实现多线程,具体步骤如下: 定义一个新的类继承自Thread类. 在新的类中实现run()方法,此方法即为新线程的运行程序代码. 创建一个新的类的对象,并调用对象的start()方法. Thread存放在java.lang类库里,但并不需加载java.lang类库,因为它会自动加载.此外,run()方法是定义在Thread类里的一个方法,把线程的程序代码编写在run()方法内,事实上所做的就是覆盖的操作.下面是用此方式实现多线程的一个例子: public cla