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