Java实现多线程的三种方式及其特点

版权声明:原创文章,未经允许,禁止转载! https://blog.csdn.net/weixin_36512652/article/details/82463377
 Java中的多线程是通过java.lang.Thread类来实现的,该类下定义了一系列关于线程的操作。关于实现多线程有多种方式,这里列举常用的三种方式:继承Thread类、实现Runnable接口、实现Callable接口。
 下面是三种实现方式:
  • 继承java.lang.Thread
//实现多线程的第一种方式
class MyThread extends Thread {
    private String name;

    public MyThread(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(name + " is running......");
        }
    }
}

@Test
public void testThread() {
    Thread a = new MyThread("线程A");
    Thread b = new MyThread("线程B");
    Thread c = new MyThread("线程C");
    a.start();
    b.start();
    c.start();
}
  • 实现Runnable接口
//实现多线程的第二种方式
class MyRunnable implements Runnable {
    private String name;

    public MyRunnable(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(name + " is running......");
        }
    }
}

@Test
public void testRunnable() {
    Thread one = new Thread(new MyRunnable("线程1"));
    Thread two = new Thread(new MyRunnable("线程2"));
    Thread three = new Thread(new MyRunnable("线程3"));
    one.start();
    two.start();
    three.start();
}
  • 实现Callable接口
//实现多线程的第三种方式
class MyCallable implements Callable<Integer> {

    private String name;
    private Integer number;

    public MyCallable(String name, Integer number) {
        this.name = name;
        this.number = number;
    }

    @Override
    public Integer call() throws Exception {
        for (int i = 0; i < number; i++) {
            System.out.println(name + " is running......");
        }
        return number;
    }
}

@Test
public void testCallable() throws ExecutionException, InterruptedException {
    //将Callable传入FutureTask
    FutureTask<Integer> ft1 = new FutureTask<>(new MyCallable("线程一", 3));
    FutureTask<Integer> ft2 = new FutureTask<>(new MyCallable("线程二", 4));
    FutureTask<Integer> ft3 = new FutureTask<>(new MyCallable("线程三", 5));
    //将FutureTask传入Thread
    Thread t1 = new Thread(ft1);
    Thread t2 = new Thread(ft2);
    Thread t3 = new Thread(ft3);
    t1.start();
    t2.start();
    t3.start();
    //获取线程返回结果
    Integer number1 = ft1.get();
    Integer number2 = ft2.get();
    Integer number3 = ft3.get();
    System.out.println("线程一返回结果:" + number1);
    System.out.println("线程二返回结果:" + number2);
    System.out.println("线程三返回结果:" + number3);
}
 各种方式执行结果:
  • 方式1执行结果
线程A is running......
线程B is running......
线程B is running......
线程B is running......
线程A is running......
线程A is running......
线程A is running......
线程A is running......
线程B is running......
线程B is running......
线程C is running......
线程C is running......
线程C is running......
线程C is running......
线程C is running......
  • 方式2执行结果
线程1 is running......
线程1 is running......
线程1 is running......
线程1 is running......
线程2 is running......
线程2 is running......
线程2 is running......
线程2 is running......
线程2 is running......
线程1 is running......
线程3 is running......
线程3 is running......
线程3 is running......
线程3 is running......
线程3 is running......
  • 方式3执行结果
线程一 is running......
线程一 is running......
线程二 is running......
线程二 is running......
线程二 is running......
线程二 is running......
线程一 is running......
线程三 is running......
线程三 is running......
线程三 is running......
线程三 is running......
线程三 is running......
线程一返回结果:3
线程二返回结果:4
线程三返回结果:5
  三种实现方式的对比:
  1. 继承Thread类:编写简单,由于java只能单一继承,所以该方式不够灵活
  2. 实现Runnable接口:从JDK1.0开始,通过实现接口,省去了单继承的弊端,可以让我们更加灵活地编写代码
  3. 实现Callable接口:从JDK1.5开始,最大的好处,可以有返回值

猜你喜欢

转载自blog.csdn.net/weixin_36512652/article/details/82463377
今日推荐