目录

1.继承Thread类

2.实现Runnable接口

3.实现Callable接口


接下来的几篇文章记录一下java高并发编程的一些知识,包括实现多线程的3种方式,线程同步的常用方式以及实现线程池的常用工具类等等,本篇先介绍用3种方式实现多线程。

1.继承Thread类

定义一个类直接继承Thread类,重写run方法即可实现多线程,但是由于java单继承的特点,那么此类不能再继承其它的类。

代码示例:

package com.kongsh.c_00;

/**
 * @ClassName MyThread01
 * @Description: 通过继承Thread,重写run方法实现多线程,缺点是只能单继承
 * @Author kongsh
 * @Date 2020/6/5
 **/
public class MyThread01 extends Thread{
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }

    public static void main(String[] args) {
        //启动5个线程,分别执行run方法
        for(int i=0;i<5;i++) {
             new MyThread01().start();
        }
    }
}
执行结果:

java运用多线程实现点名 java 多线程 实现_java

2.实现Runnable接口

通过实现runnable接口中的run方法即可实现多线程,而且不受单继承特点的限制

代码示例:

package com.kongsh.c_00;

/**
 * @ClassName MyThread02
 * @Description: 通过实现Runnable接口,实现run方法实现多线程,启动线程需要通过Thread类
 * @Author kongsh
 * @Date 2020/6/5
 **/
public class MyThread02 implements Runnable{
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }

    public static void main(String[] args) {
        for(int i=0;i<5;i++) {
            new Thread(new MyThread02()).start();
        }
    }
}

执行结果:

java运用多线程实现点名 java 多线程 实现_java 多线程分配_02

3.实现Callable接口,通过FutureTask包装器创建Thread线程

Callable接口和Runnable接口是类似的,但是需要实现的是call方法,而且从上面的代码中我们可以看到run()方法执行的任务是没有返回值的,但是call方法有返回值,可以自定义返回值的类型,这就是两个接口最大的区别。

代码示例:

package com.kongsh.c_00;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

/**
 * @ClassName MyThread03
 * @Description: 通过实现Callable接口的call方法实现多线程程序
 * 特点:有返回值,通过FutureTask包装器来创建Thread线程
 * @Author kongsh
 * @Date 2020/6/5
 **/
public class MyThread03 implements Callable {
    @Override
    public Integer call() throws Exception {
        System.out.println(Thread.currentThread().getName());
        return 10;
    }

    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            //通过MyThread03实例化一个Callable对象
            Callable call = new MyThread03();
            //通过call实例化FutureTask类
            // 因为此类实现了Runnable接口,所以可以作为Thread构造方法的参数
            FutureTask<Integer> task = new FutureTask<>(call);
            new Thread(task).start();
        }
    }
}

执行结果:

java运用多线程实现点名 java 多线程 实现_代码示例_03