Java多线程的几种实现方式

1,082 阅读1分钟

在工作当中,个人常用多线程来做一些数据处理的工作,以此来加快数据处理速度。截止到Java8,实现多线程有4种写法,记下相关代码备查。

通过继承Tread类开启多线程

public static void main(String[] args) {
    System.out.println("主线程名称:" + Thread.currentThread().getName());
    Task task1 = new Task();
    Task task2 = new Task();
    task1.start();
    task2.start();
}

public static class Task extends Thread {

    @Override
    public void run() {
        try {
            for (int i = 0; i < 10; i++) {
                System.out.println("线程" + Thread.currentThread().getName() + "的消息:" + i);
                Thread.sleep(800);
            }
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
    }
}

通过Runnable接口实现多线程

public static void main(String[] args) {
    System.out.println("主线程名称:" + Thread.currentThread().getName());
    Thread task1 = new Thread(new Task());
    Thread task2 = new Thread(new Task());
    task1.start();
    task2.start();
}

public static class Task implements Runnable {

    @Override
    public void run() {
        try {
            for (int i = 0; i < 10; i++) {
                System.out.println("线程" + Thread.currentThread().getName() + "的消息:" + i);
                Thread.sleep(800);
            }
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
    }
}

通过Callable+FutureTask实现带返回值的多线程

public static void main(String[] args) {
    System.out.println("主线程名称:" + Thread.currentThread().getName());
    Callable<String> crb1 = new Task();
    Callable<String> crb2 = new Task();
    FutureTask<String> task1 = new FutureTask<>(crb1);
    FutureTask<String> task2 = new FutureTask<>(crb2);
    Thread thread1 = new Thread(task1);
    Thread thread2 = new Thread(task2);
    thread1.start();
    thread2.start();
    try {
        System.out.println("task1返回结果:" + task1.get());
        System.out.println("task2返回结果:" + task2.get());
    } catch (Exception e) {
        System.out.println("获取FutureTask返回结果异常:" + e.getMessage());
    }
}

public static class Task implements Callable<String> {

    @Override
    public String call() throws Exception {
        try {
            for (int i = 0; i < 10; i++) {
                System.out.println("线程" + Thread.currentThread().getName() + "的消息:" + i);
                Thread.sleep(800);
            }
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
        return "返回结果:" + Thread.currentThread().getName();
    }
}

通过线程池技术实现多线程(推荐)

Executors

public static void main(String[] args) {
    System.out.println("主线程名称:" + Thread.currentThread().getName());
    ExecutorService executorService = Executors.newFixedThreadPool(2);
    executorService.execute(new Task());
    executorService.execute(new Task());
}

public static class Task implements Runnable {

    @Override
    public void run() {
        try {
            for (int i = 0; i < 10; i++) {
                System.out.println("线程" + Thread.currentThread().getName() + "的消息:" + i);
                Thread.sleep(800);
            }
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
    }
}

ThreadPoolExecutor

public static void main(String[] args) {
    System.out.println("主线程名称:" + Thread.currentThread().getName());
    ThreadPoolExecutor executorService = new ThreadPoolExecutor(2, 2, 5, TimeUnit.MINUTES, new LinkedBlockingDeque<Runnable>());
    executorService.execute(new Task());
    executorService.execute(new Task());
}

public static class Task implements Runnable {

    @Override
    public void run() {
        try {
            for (int i = 0; i < 10; i++) {
                System.out.println("线程" + Thread.currentThread().getName() + "的消息:" + i);
                Thread.sleep(800);
            }
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
    }
}