2-Java中四种创建并执行线程的方式

1. 继承Thread对象重写run方法

注意,针对MyThread实例我们可以调用run方法和start方法,这两种方法是有很大区别的;run方法作用是直接在当前线程执行重写的run方法里面的代码,跟直接调用一个实例方法没什么两样。而start方法作用是创建一个线程,等待CUP分配给新创建的线程,分配到后再执行run方法。因此我们想创建一个新线程来执行业务逻辑就必须调用start方法。

public class HowCanCreateThread extends Thread{
    public static void main(String[] args) {

        MyThread myThread = new MyThread();
        myThread.start();
    }
}

class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("自定义线程逻辑");
    }
}

2. 实现Runnable接口

一般情况下我们都是偏向于使用实现Runnable接口的方式进行线程创建;因为这种方式能够将的执行逻辑,也就是run方法里面的业务内容和Thread类进行分开,有利于解耦;同时由于Java单继承的特性,继承也是一种宝贵的资源,我们的业务类去继承了Thread类就不能去继承其他类了,降低了扩展性。

public class HowCanCreateThread extends Thread{
    public static void main(String[] args) {
        
        Runnable runnable = new MyRunnable();
        Thread threadByRunnable = new Thread(runnable);
        threadByRunnable.start();
    }
}

class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("自定义线程逻辑");
    }
}

3. 实现Callable接口(带返回值)

public class HowCanCreateThread extends Thread{
    public static void main(String[] args) {

        // 1.创建Callable接口实现类
        Callable<String> callable = new MyCallable();
        // 2.创建FutureTask传入callable实例,接收callable返回值
        FutureTask<String> futureTask = new FutureTask<>(callable);
        // 3.创建Thread传入futureTask实例,启动start方法
        Thread threadByCallable = new Thread(futureTask);
        threadByCallable.start();
        
        // 4.获取返回值
        try {
            System.out.println( futureTask.get() );
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
        
    }
}


class MyCallable implements Callable<String> {
    @Override
    public String call() {
        return "带执行返回值的线程逻辑";
    }
}

4. 使用线程池

public class HowCanCreateThread extends Thread{
    public static void main(String[] args) {
        
        Runnable runnable = new MyRunnable();
        // 创建五个固定数量线程的线程池
        ExecutorService executorByNoResult = Executors.newFixedThreadPool(5);
        // 提交runnable到线程池中进行执行
        executorByNoResult.submit(runnable);
        // 执行完毕关闭线程池
        executorByNoResult.shutdown();
    }
}

class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("线程逻辑");
    }
}

补充: 下面几个核心类的学习是对灵活掌握多线程编程是很重要的, 有时间请自行去扩展吧😀

/**
 * 核心类的学习:
 * Thread
 * FutureTask
 * Future
 * ExecutorService
 * Executors
 */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值