美文网首页
Java实现多线程的三种方式

Java实现多线程的三种方式

作者: SinX竟然被占用了 | 来源:发表于2017-09-07 22:20 被阅读0次

1、Java实现多线程主要有三种方式:

  • (1)继承Thread类
  • (2)实现Runnable接口
  • (3)使用ExecutorService、Callable、Future实现有返回结果的多线程。

其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。

2、方式一:继承Thread类

Thread类本质上也是实现了Runnable接口的一个类,它代表一个线程的实例。

启动线程的唯一方法就是通过Thread类的start()方法。start()方法是一个native方法,它将启动一个新线程,并执行run()方法。

通过自己的类直接extends Thread,并复写run()方法,就可以启动新线程并执行自己定义的run()方法。

//实现多线程方式一:继承Thread类
public class MyThread extends Thread {
    
    @Override
    public void run() {
        
        System.out.println("启动一个新线程, 并执行run()方法.");
    }
    
    
    public static void main(String[] args) {
        
        MyThread myThread = new MyThread();
        myThread.start();
    }
}

3、方式二:实现Runnable接口

如果自己的类已经extends另一个类,就无法直接extends Thread,此时,必须通过实现Runnable接口来创建线程。

public class Test {

    public static void main(String[] args) {
        
        Thread newThread = new Thread(new MyThread());
        newThread.start();
    }
}

class OtherClass {
    
}

//实现多线程方式二:实现Runnable接口
class MyThread extends OtherClass implements Runnable {

    @Override
    public void run() {
        System.out.println("创建线程, 并执行run()方法.");
    }
    
}

4、方式二:使用ExecutorService、Callable、Future实现有返回结果的多线程

需要开启新线程执行有返回值的任务必须实现Callable接口。

执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable任务返回的Object结果了。

结合线程池接口ExecutorService就可以实现有返回结果的多线程了。

import java.util.concurrent.*;
import java.util.Date;
import java.util.List;
import java.util.ArrayList;

/**
 * 有返回值的线程
 * @author Tao
 *
 */

public class Test {
    
    public static void main(String[] args) throws 
    InterruptedException, ExecutionException {
        
        int poolSize = 10;  //线程池大小
        //创建一个线程池
        ExecutorService threadPool = Executors.newFixedThreadPool(poolSize);
        //创建多个Task
        List<Future<Object>> futureList = new ArrayList<>();
        for(int i = 0; i < poolSize; i++) {
            Callable<Object> task = new MyTask("NO" + i);
            //放入线程池中执行任务并取得返回值
            Future<Object> future = threadPool.submit(task);
            futureList.add(future);
        }
        
        //关闭线程池
        threadPool.shutdown();
        
        //输出所有结果
        for(Future<Object> f : futureList) {
            System.out.println(f.get().toString());
        }
    }
    
}

//定义任务类
class MyTask implements Callable<Object> {

    private String taskNum; //任务编号
    
    public MyTask(String taskNum) {
        this.taskNum = taskNum;
    }
    
    @Override
    public Object call() throws Exception {

        System.out.println("任务 " + taskNum + " 启动了...");
        Date startTime = new Date();
        Thread.sleep(1000);
        Date endTime = new Date();
        long costTime = endTime.getTime() - startTime.getTime();
        System.out.println("任务 " + taskNum + " 执行完毕.");
        
        //返回值
        return taskNum + " 任务返回运行结果, 任务执行耗费时间【" + costTime + "毫秒】";
    }
    
}

相关文章

  • java多线程

    1.JAVA多线程实现方式 JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用E...

  • java并发编程(一)

    **java多线程编程(一)** 基本实现方式及同步原理 --- 三种实现方式: 1、继承Thr...

  • Java多线程-实例解析

    Java多线程实例 3种实现方法 Java中的多线程有三种实现方式: 1.继承Thread类,重写run方法。Th...

  • java 多线程创建及运行

    java多线程实现方式1.1 三种创建线程的方式 继承Thread类,重写run()方法 实现Runable()接...

  • JAVA多线程实现的三种方式

    JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService...

  • java并发编程(一)

    java多线程编程(一) 三种实现方式: 1、继承Thread 2、实现Runable 这是Runable的源码所...

  • 面试-实现多线程的方式

    Java中实现多线程的方式有下面三种: 继承Thread类,重写run方法 实现Runnable接口,重写run方...

  • Java实现多线程的三种方式

    1、Java实现多线程主要有三种方式: (1)继承Thread类 (2)实现Runnable接口 (3)使用Exe...

  • java多线程常见面试题

    1.java多线程有哪几种实现方式 三种方式: 1.继承Thread类实现多线成 2.实现Runnable接口 3...

  • Java多线程实现

    导语 Java是一门为数不多的多线程支持的编程语言。 主要内容 掌握Java中三种多线程的实现方式 具体内容 如果...

网友评论

      本文标题:Java实现多线程的三种方式

      本文链接:https://www.haomeiwen.com/subject/oaywjxtx.html