Java 多线程基础(二)多线程的实现方式

Java 多线程基础(二)多线程的实现方式

在Java中,java使用Thread类代表线程,所有的线程对象都必须是Thread或者其子类的实例,每个线程的作用是完成一定任务,实际上是就是执行一段程序流(一段顺序执行的代码)。实现多线程一共有4种方式,分别是继承于Thread 类、实现 Runnable 接口、带有返回结果的 Callable 接口通过FutureTask包装器来创建T和使用 ExecutorService、Callable、Future 实现有返回结果的线程。

其中,继承 Thread 和 实现 Runnable 接口是实现多线程最常用的两种方式,两者实现的线程是没有返回结果的。

带有返回结果的 Callable 接口通过FutureTask包装器来创建T和使用 ExecutorService、Callable、Future 实现有返回结果的线程。是JDK1.5之后更新的,可以创建带有返回值的线程,两者在java.util.concurrent包中通过的线程池来实现多线程。

一、Runnable 接口

Runnable 是一个接口,该接口只定义了一个 run() 方法,由实现类实现。该接口的定义如下:

@FunctionalInterface  // 此注解表明这是函数式接口
public interface Runnable {
    public abstract void run();
}

Runnable的作用是实现多线程。我们可以定义一个类实现 Runnable 接口;然后,通过new Thread(new A())等方式新建线程。

二、Thread 类

 Thread 类本身实现了 Runnable 接口,在Runnable 接口的基础上,扩展了多线程的功能,该类的定义如下:

public class Thread implements Runnable { }

Thread 的作用也是实现多线程。我们可以定义一个类继承 Thread 接口,然后重写 run() 方法;然后通过通过new 自定义类()等方式新建线程。

三、Thread 和 Runnable的异同

1、相同点:都是“多线程的实现方式”。

2、不同点:Thread 是类,而Runnable是接口;Thread本身是实现了Runnable接口的类。我们知道“一个类只能有一个父类,但是却能实现多个接口”,因此Runnable具有更好的扩展性。此外,Runnable还可以用于“资源的共享”。即,多个线程都是基于某一个Runnable对象建立的,它们会共享Runnable对象上的资源。通常,建议通过“Runnable”实现多线程!

四、实例

通过网上经典卖票的的例子,演示 Thread 和 Runnable 的实例。

1、继承 Thread 类

// 继承Thread 的线程类
class MyThread extends Thread{
    private int ticket = 10;
    @Override
    public void run() {
        while(true) {
            if(this.ticket < 1) break;
            System.out.println(Thread.currentThread().getName() + "--> 正在卖 " + this.ticket + "张票");
            this.ticket--;
        }
    }
}
// main 方法类
public class ThreadDemo {
    public static void main(String[] args) {
        Thread t1 = new MyThread();
        Thread t2 = new MyThread();
        Thread t3 = new MyThread();
        
        // 开启3个线程,每个线程各卖 10 张票
        t1.start();
        t2.start();
        t3.start();
    }
}

2、实现 Runnable 接口

//实现 Runnable接口的自定义线程类
class MyRunnable implements Runnable{
    private int ticket = 10;
    @Override
    public void run() {
        while(true) {
            if(this.ticket < 1) break;
            System.out.println(Thread.currentThread().getName() + "--> 正在卖 " + this.ticket + "张票");
            this.ticket--;
        }
    }
}
public class ThreadDemo {
    public static void main(String[] args) {
        Runnable run = new MyRunnable();// 实现 Runnable接口的自定义线程类
        // 创建三个 Thread 对象,传递同一个MyRunnable 对象
        Thread t1 = new Thread(run);
        Thread t2 = new Thread(run);
        Thread t3 = new Thread(run);
        
        // 开启3个线程,3个线程共卖10张票
        t1.start();
        t2.start();
        t3.start();
    }
}
posted @ 2020-06-06 20:24  凌倾-学无止境  阅读(177)  评论(0编辑  收藏  举报