欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java创建多线程的四种方式

程序员文章站 2022-06-09 21:11:51
...

一、继承Thread类

1.创建一个继承于Thread类的子类
2.重写Thread类的run() -->将此线程执行的操作声明在run()中
3.创建Thread类的子类的对象
4.通过此对象调用start():
① 启动当前线程
② 调用当前线程的run()

代码演示

/**
 * @Description: 开启多线程的第一种方法
 * @Date:Created in 2020/6/8 17:19
 */

public class MyThread {

    public static void main(String[] args) {
        MyThreadTest p = new MyThreadTest();
        p.start();
        for (int i = 0; i < 100; i++){
            if(i%2 == 0){
                System.out.println(Thread.currentThread().getName()+":"+i);
            }
        }
    }
}
class MyThreadTest extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++){
            if(i%2 == 0){
                System.out.println(Thread.currentThread().getName()+":"+i);
            }
        }
    }
}

二、实现Runnable接口

1.创建一个实现了Runnable接口的类
2.实现类去实现Runnable中的抽象方法:run()
3.创建实现类的对象
4.将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象
5.通过Thread类的对象调用start()

代码演示

/**
 * @Date:CreatedIn 2020/6/8 19:54
 * @Description: 开启多线程的第二种方法
 * 1、创造一个类实现名字为Runnable接口
 * 2、重写run()函数
 * 3、在run()函数中完成自己线程内需要处理的工作
 * 4、创建自己类的对象
 * 5、将自己的类的对象传入Thread类的构造函数
 * 6、通过Thread的对象调用start()方法
 * 两种方法对比:
 * 开发中优先选择实现Runable接口的这种方法
 * 优点:1、Runable方法可以避开java类的单继承性的缺点
 *      2、实现的方式适合来处理多个线程有共享数据的情况
 *  本质:
 *      其实Thread类也是通过实现Runable接口的形式来重写run()方法开启多线程的
 *      所以我们可以跳过继承Thread类选择直接去实现Runable接口中run()方法开启多线程。
 */
class MThread implements Runnable{

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName());
        for (int i = 0; i < 100; i++) {
            if (i %2 == 0){
                System.out.println(i);
            }
        }
    }
}
public class MyThread1 {
    public static void main(String[] args) {
        MThread myThread = new MThread();
        Thread t1 = new Thread(myThread);
        t1.start();
        System.out.println(Thread.currentThread().getName());


    }
}

三、实现Callable接口

代码演示

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

/**
 * @Date:CreatedIn 2020/6/9 17:07
 * @Description:
 * 开启多线程的第三种方法:通过实现Callable接口的方式
 * 这种方式的优点是可以有返回值,而且可以抛异常。
 * 还支持泛型
 *
 */
class GetSum implements Callable{

    @Override
    public Object call() throws Exception {
        int sum = 0;
        for (int i = 1; i <= 100; i++) {
            if (i %2 == 0) {
                System.out.println(i);
                sum += i;
            }
        }
        return sum;
    }
}
public class GetSumTest {
    public static void main(String[] args) {
        //创建类
        GetSum getSum = new GetSum();
        //使用FutureTask类对象作为参数传递给Thread的构造器
        FutureTask futureTask = new FutureTask(getSum);
        new Thread(futureTask).start();
        try {
            int res = (int)futureTask.get();
            System.out.println(res);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}

四、线程池(响应速度提高了,提高了资源的重用率,便于管理)

代码演示

import java.util.concurrent.*;

/**
 * @Date:CreatedIn 2020/6/9 17:28
 * @Description:
 * 开启多线程的第四种方式:使用线程池(开发中常用)
 * corePoolSize:核心池大小
 * maximumPoolSize:最大线程数
 * KeepAliveTime:线程没有任务时最多保持多长时间会终止
 */
class Thread4 implements Runnable{

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            if (i%2 == 0)
            {
                System.out.println(Thread.currentThread().getName()+":"+i);
            }
        }
    }
}
class Thread5 implements Runnable{

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            if (i%2 != 0)
            {
                System.out.println(Thread.currentThread().getName()+":"+i);
            }
        }
    }
}
public class Thread4Test {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(10);
//        ThreadPoolExecutor service = (ThreadPoolExecutor)executorService;
//        service.setCorePoolSize(10);
//        service.setMaximumPoolSize(20);
//        service.setKeepAliveTime();

        executorService.execute(new Thread4());
        executorService.execute(new Thread5());
        //executorService.submit()此方法是对应Callable接口的方式 ,可以用FutureTask类调用get()返回值。
        executorService.shutdown();//关闭线程池
    }
}