多线程—创建方式

导读:本篇文章讲解 多线程—创建方式,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

创建方式

有三种:1.继承Thread类,2.实现Runnable接口,3.实现Callable接口

1.继承Thread类

用类来继承Thread类并且重写其中的run方法,再调用start方法来开启线程。

//创建线程方式一:继承Thread类,重写Run()方法,调用Start()开启线程

//线程开启不一定立即执行,由cpu调度。
public class Text extends Thread{
    @Override
    public void run() {
        //run方法线程体
        for (int i = 0;i < 10;i ++){
            System.out.println("我在看代码"+i);
        }
    }

    public static void main(String[] args) {
        //创建一个线程对象
        Text test = new Text();
        //调用start方法开启线程,看代码和学习交替输出,线程同时运行,如果该处是run方法则先输出看代码,再到学习
        test.start();
        //main线程
        for (int i = 0;i < 20;i ++){
            System.out.println("我在学习"+i);
        }
    }
}

不推荐使用:避免OOP单继承的局限性

2.实现Runnable接口

用类来实现runnable接口,并且重写接口中的run方法,再在主方法中创建该类的对象,再创建Thread线程类对象,将实现runnable接口的对象作为参数传入Thread线程类对象,再让Thread线程类对象调用start方法来启动线程。

//创建线程方式2:实现Runnable接口,重写run方法,执行线程需要丢入runnable接口实现类,调用start方法
public class SetMethod2 implements Runnable{
    @Override
    public void run() {
        //run方法线程体
        for (int i = 0;i < 10;i ++){
            System.out.println("我在看代码"+i);
        }
    }

    public static void main(String[] args) {
        //创建一个runnable接口的实现类对象
        SetMethod2 setMethod2 = new SetMethod2();

        //就是要将runnable接口的实现类对象作为参数传入Thread类对象里面,再调用Thread类对象调用start
        //创建线程对象,通过线程对象来开启我们的线程,代理
        //Thread thread = new Thread(setMethod2);
        //thread.start();
        //Thread类对象在此作为一个代理
        new Thread(setMethod2).start();

        for (int i = 0;i < 20;i ++){
            System.out.println("我在学习"+i);
        }
    }
}

推荐使用:避免单继承的局限性,灵活方便,方便同一个对象被多个线程使用

3.实现Callable接口

​ 1.实现Callable接口,需要返回值类型

​ 2.重写call方法,需要抛出异常

​ 3.创建目标对象

​ 4.创建执行服务:ExecutorService ser = Executors.newFixedThreadPool(1); //创建线程池

​ 5.提交执行:Future result1 = ser.submit(t1)

​ 6.获取结果:boolean r1 = result1.get();

​ 7.关闭服务: ser.shutdownNow();

代入网图下载的案例(结合下文网图下载案例来看)

import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.concurrent.*;

//好处:
//1.可以定义返回值
//2.可以抛出异常
public class SetMethod3 implements Callable<Boolean> {


    private  String url;
    private  String name;
    public SetMethod3(String url,String name){
        this.url = url;
        this.name = name;
    }

    //下载图片线程的执行体
    @Override
    public Boolean call() {
        WebDownLoader webDownLoader = new WebDownLoader();
        webDownLoader.downloader(url,name);
        System.out.println("下载文件名为"+name);
        return true;
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        SetMethod3 t1 = new SetMethod3("https://dgss2.bdstatic.com/5bVYsj_p_tVS5dKfpU_Y_D3/data/5da01018afc3ffb13aaf8f0e34d23f0c","2.jpg");
        SetMethod3 t2 = new SetMethod3("https://dgss2.bdstatic.com/5bVYsj_p_tVS5dKfpU_Y_D3/data/5da01018afc3ffb13aaf8f0e34d23f0c","3.jpg");
        SetMethod3 t3 = new SetMethod3("https://dgss2.bdstatic.com/5bVYsj_p_tVS5dKfpU_Y_D3/data/5da01018afc3ffb13aaf8f0e34d23f0c","4.jpg");

       //创建执行任务
        ExecutorService ser = Executors.newFixedThreadPool(3);//newFixedThreadPool代表线程池,里面有三个线程

        //提交执行
        Future<Boolean> r1 = ser.submit(t1);
        Future<Boolean> r2 = ser.submit(t2);
        Future<Boolean> r3 = ser.submit(t3);

        //获取结果
        boolean rs1 = r1.get();
        boolean rs2 = r2.get();
        boolean rs3 = r3.get();
        
        //关闭服务
        ser.shutdownNow();

    }
    //下载器
    class WebDownLoader{
        //下载方法
        public void downloader(String url,String name){
            try {
                FileUtils.copyURLToFile(new URL(url),new File(name));//将网页地址的图片变成一个文件
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("io异常,download方法出现异常");
            }
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/84205.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!