创建线程的三种方式及优缺点

线程之间的执行是相互独立的,哪一个线程优先执行取决于执行取决于os的调度

线程创建的方式:3种
实现runnable接口、继承Thread、实现Callable接口

实现Runnable接口
1、创建自定义类并实现Runable接口,并实现接口中的run方法
2、实例化自定的类
3、将自定义类的实例作为参数Thread类,创建thread实例
4、调用Thread实例的start方法,启动子线程

public class printRunable implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("run:"+i);
        }
    }
}

mian

public static void main(String[] args) {
    printRunable printRunable = new printRunable();
    Thread thread1 = new Thread(printRunable);
    thread1.start();
    for (int i = 0; i < 10; i++) {
        System.out.println("main:"+ i);
    }
}

继承Thread类方式创建新线
1、创建自定义的类继承Thread类,并且重写run接口
2、实例化自定义
3、通过实力化对象调用start方法来创建新线,
public void start()
使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
结果是两个线程并发地运行;当前线程(从调用返回给 start 方法)和另一个线程(执行其 run 方法)。
多次启动一个线程是非法的。特别是当线程已经结束执行后,不能再重新启动
thread.start();底层原理是会重新开辟一个和main方法一样的栈空间
thread.run() :它会在main占内存里面开辟新空间

public class MyThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("run:"+i);
        }
    }
}

mian

public static void main(String[] args) {
    MyThread thread = new MyThread();
    thread.start();
    for (int i = 0; i < 10; i++) {
        System.out.println("main:"+ i);
    }
}

实现Callable接口
Callable接口的实现它是线程池提供的一种创建线程的方式
1、实现Callable接口,并实现call方法
2、创建线程池(Excutors工具类提供的方法创建线程池)
3、创建Callable接口实现类实例
4、将实例对象通过线程池的submit 方法提交给线程池进而创建新的线程

public class CallableTherad implements Callable<Integer> {
    @Override
    public Integer call() {
        for (int i = 0; i < 10; i++) {
            System.out.println("run:"+i);
        }
        return 1000;
    }
}

mian

System.out.println(Thread.currentThread().getName() + "  start");
ExecutorService executorService = Executors.newSingleThreadExecutor();
CallableTherad callableTherad = new CallableTherad();
Future<Integer> submit = executorService.submit(callableTherad);
Integer integer = submit.get();
System.out.println(integer);
System.out.println(Thread.currentThread().getName() + "  end");

三种实现创建线程的优缺点:
通过集成Thread类或者实现Runable,Callable接口都可以实现多线程,不过实现Runable接口与实现Callable接口的方式基本相同,只是Callable接口里得到定义的方法有返回值,可以声明抛出异常而已
。因此可以将实现Runable接口和实现Callable归为一种方式。这种方式与Thread方式之间的主要差别如下:
1、采用Runable/Callable接口的方式创建多线程的优缺点:
优势、1、线程类只是实现了Runable接口与Callable接口,换可以继续继承其他类。
2、在这种方式下,多个线程可以共享一个target对象,所以非常合适多个相同线程来处理同一份资源情况,从而可以将cpu。代码和数据分开,形式清晰的模型,较好地体现了面向对象的思想
劣势:编程比较复杂,如果要访问当前线程则必须使用Thread.currentThread() 方法
2、采用Thread类的方法创建多线程的优缺点:
优势:
编写简单,如果需要访问当前线程,则无须使用Thread.currentThread()方法,直接使用this即可获得当前线程
劣势:
因为线程继承了Thread类,所以不能在继承其他父类。
总结:因此一般采用Runable接口、Callable接口的方式来创建多线程

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值