线程的四种创建方法

线程的四种创建方法,第1张

1.继承Thread类

Thread类本质上就是Runnable接口的一个实现类,代表一个线程对象。

public class MyThread extebds Thread{
    public void run(){
        //需要在线程中执行的逻辑
    }
}

启动线程的唯一方法就是调用Thread类中定义的start方法,不能直接调用run方法。

这种编程实现线程的方法最大的限制就是java的单根继承,这种方式基本不同。

2.实现Runnable接口

接口定义:

@FunctionalInterface  函数式接口注解声明,提供了JDK1.8中函数式编程的支持lambda表达式

public interface Runnable{
    public abstract void run();  //线程中的执行逻辑
}

实现 Runnable接口可以采用定义独立类、定义内部类【匿名内部类】、lambdajdk1.8+

public calss RigthRunnable implements Runnable{
    public void run(){
        for(int i=0;i<50;i++){
            System.out.println("右手。。。。。");
        }
    }
}

启动线程:

Thread t=new Thread(new RightRunnable());
t.start();

定义匿名内部类:

Thread t =new Thread(new Runnable(){
    public voud run(){
        for(int i=0;i<50;i++){
            System.out.println("右手。。。。");
        }
    }
});
t.start();

 lambda写法:

Thread t=new Thread(()->{
    for(int i=0;i<50;i++){
        System.out.println("右手。。。。");
    }
});
t.start();
3.使用Callable和Future接口创建线程

创建Callable接口的实现类,并且实现call()方法。使用FutureTask类来包装Callable接口实现类的对象,并且以FutureTask对象作为Thread对象的target 来创建线程。

定义Callable接口的实现类:

public class MyCallable implements Callable{
    int begin=0;
    int end=0;
    public MyCallable(int begin,int end){
        this.begin=begin;
        this.end=end;
    }
    public Integer call() throws Exception{
        int res=0;
        for(int i=begin;i
4.使用线程池创建线程

创建线程需要花费昂贵的资源和时间,如果每次都是任务到来时才创建线程对象,那么响应时间会边长,而且一个进程能够创建的线程数有限。为了避免这些问题,在程序启动时就创建若干个线程对象用于响应处理,这个就称为线程池,里面的每个线程就叫工作线程。

享元模式:

享元模式Flyweight Pattern主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。

优点:大大减少对象的创建,降低系统的内存,使效率提高。

缺点:提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱。

使用场景:1、系统有大量相似对象。 2、需要缓冲池的场景。

原型模式:

原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。

使用线程池的优势

重用存在的线程,减少对象的创建和消亡的开销,性能较好

可以有效地控制最大并发线程数,提供系统资源的利用率,同时避免过多的资源竞争

提供了定时执行、定期执行、单线程、并发数控制等功能

如何选用创建方式: 

一般创建线程对象时不建议使用extends Thread方法:单根继承体系

如果没有返回结果建议使用Runnable接口

如果有返回值建议使用Callable接口

如果使用线程比较频繁建议使用线程池,ThreadPoolExecutor

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/719657.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)