2021-07-16 多线程学习

本文详细介绍了使用多线程的三种方法:继承Thread类、实现Runnable接口和Callable接口,通过龟兔赛跑示例演示并发执行。讲解了如何启动线程及线程调度,并展示了Callable接口的返回值处理。
摘要由CSDN通过智能技术生成


前言

多线程使用学习

一、使用多线程方法

①:继承Thread类【实际上也是实现了Runnable接口】

启动线程:子类对象.start()   不建议使用:避免OOP单继承局限性

/**
 * 创建线程方法1
 *
 *    继承thread类
 *    重写run方法
 *    调用start开启线程
 *
 *
 *    总结:线程开启不一定立即执行,由CPU调度执行
 *
 */
public class TestThread1 extends Thread{

    @Override
    public void run() {
        //run方法线程体
        for (int i = 0; i < 20; i++) {
            System.out.println("run方法-----------" + i);
        }
    }


    /**
     * 穿插执行
     * @param args
     */
    public static void main(String[] args) {
        TestThread1 thread1 = new TestThread1();
        thread1.start();
        for (int i = 0; i < 2000; i++) {
            System.out.println("main方法-----------" + i);
        }
    }
}

②:实现Runnable接口

启动线程:传入目标对象 + Thread对象.start()   建议使用

/**
 * 创建线程方法2
 *
 *    实现Runnable接口
 *    实现run方法
 *    丢入thread接口实现类 调用start开启线程
 *
 *
 *    总结:线程开启不一定立即执行,由CPU调度执行
 *
 */
public class TestThread3 implements Runnable{
    @Override
    public void run() {
        //run方法线程体
        for (int i = 0; i < 20; i++) {
            System.out.println("run方法-----------" + i);
        }
    }


    public static void main(String[] args) {
        TestThread3 t3 = new TestThread3();
        new Thread(t3).start();

        for (int i = 0; i < 2000; i++) {
            System.out.println("main方法-----------" + i);
        }
    }
}

③:实现Callable接口 (有返回值)

/**
 * @Auther RenHuiMa
 * @Date 2021-07-16 10:14
 **/
public class TestThread6 implements Callable<Boolean> {
    @Override
    public Boolean call() throws Exception {
        down(url,name);
        System.out.println("Callable下载了文件名为:" + name);
        return true;
    }


    private String url;
    private String name;

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

    public void down(String url,String name){
        try {
            FileUtils.copyURLToFile(new URL(url),new File(name));
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("IO异常!");
        }
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        TestThread6 t1 = new TestThread6("https://bpic.588ku.com//back_origin_min_pic/19/10/22/ce4f49e80c3e4a3e2fce838cb9f28dc9.jpg!/fw/750/quality/99/unsharp/true/compress/true","1.png");
        TestThread6 t2 = new TestThread6("https://bpic.588ku.com//back_origin_min_pic/19/10/22/fcd792510564568053ecd83009319999.jpg!/fw/750/quality/99/unsharp/true/compress/true","2.png");
        TestThread6 t3 = new TestThread6("https://bpic.588ku.com//back_origin_min_pic/19/10/22/fcd792510564568053ecd83009319999.jpg!/fw/750/quality/99/unsharp/true/compress/true","3.png");


        // 创建执行服务
        ExecutorService ser = Executors.newFixedThreadPool(3);

        // 提交执行
        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();

        System.out.println(rs1);
        System.out.println(rs2);
        System.out.println(rs3);
        // 关闭服务
        ser.shutdownNow();
    }
}

二、使用例子(模拟龟兔赛跑)

1.代码

代码如下(示例):

/**
 * @Auther RenHuiMa
 * @Date 2021-01-23 17:44
 **/
public class RaceThread implements Runnable{

    /* 定义胜利者 */
    private static String winner;


    public void run() {

        for (int i = 0; i <= 100; i++) {

            /* 模拟兔子睡觉 */
            if(Thread.currentThread().getName().equals("兔子") && i%10 == 0){
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }


            /* 比赛结束 */
            if(gameOver(i)){
                break;
            }

            System.out.println(Thread.currentThread().getName() + "-->跑了" + i + "步");
        }
    }

    private boolean gameOver(int step) {
        if(winner != null){
            return true;
        }else{

            if(step >= 100){
                winner = Thread.currentThread().getName();
                System.out.println("winner is" + winner);
                return true;
            }
        }
        return false;
    }


    public static void main(String[] args) {
        RaceThread race = new RaceThread();
        new Thread(race,"兔子").start();
        new Thread(race,"乌龟").start();
    }
}
结果:
"C:\Program Files\Java\jdk1.8.0_181\bin\java.exe" "-javaagent:D:\WorkTool\IntelliJ IDEA 2018.3.4\lib\idea_rt.jar=55099:D:\WorkTool\IntelliJ IDEA 2018.3.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_181\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\rt.jar;H:\IDEAworkspace\javaTestDemo\target\classes" RaceThread
乌龟-->跑了0步
乌龟-->跑了1步
乌龟-->跑了2步
乌龟-->跑了3步
乌龟-->跑了4步
乌龟-->跑了5步
乌龟-->跑了6步
乌龟-->跑了7步
乌龟-->跑了8步
乌龟-->跑了9步
乌龟-->跑了10步
乌龟-->跑了11步
乌龟-->跑了12步
乌龟-->跑了13步
乌龟-->跑了14步
乌龟-->跑了15步
乌龟-->跑了16步
乌龟-->跑了17步
乌龟-->跑了18步
乌龟-->跑了19步
乌龟-->跑了20步
乌龟-->跑了21步
乌龟-->跑了22步
乌龟-->跑了23步
乌龟-->跑了24步
乌龟-->跑了25步
乌龟-->跑了26步
乌龟-->跑了27步
乌龟-->跑了28步
乌龟-->跑了29步
乌龟-->跑了30步
乌龟-->跑了31步
乌龟-->跑了32步
乌龟-->跑了33步
乌龟-->跑了34步
乌龟-->跑了35步
乌龟-->跑了36步
乌龟-->跑了37步
乌龟-->跑了38步
乌龟-->跑了39步
乌龟-->跑了40步
乌龟-->跑了41步
兔子-->跑了0步
乌龟-->跑了42步
兔子-->跑了1步
乌龟-->跑了43步
乌龟-->跑了44步
乌龟-->跑了45步
兔子-->跑了2步
乌龟-->跑了46步
乌龟-->跑了47步
乌龟-->跑了48步
乌龟-->跑了49步
兔子-->跑了3步
兔子-->跑了4步
兔子-->跑了5步
兔子-->跑了6步
兔子-->跑了7步
乌龟-->跑了50步
乌龟-->跑了51步
乌龟-->跑了52步
乌龟-->跑了53步
乌龟-->跑了54步
乌龟-->跑了55步
乌龟-->跑了56步
乌龟-->跑了57步
兔子-->跑了8步
兔子-->跑了9步
乌龟-->跑了58步
乌龟-->跑了59步
乌龟-->跑了60步
乌龟-->跑了61步
乌龟-->跑了62步
乌龟-->跑了63步
乌龟-->跑了64步
乌龟-->跑了65步
乌龟-->跑了66步
乌龟-->跑了67步
乌龟-->跑了68步
乌龟-->跑了69步
乌龟-->跑了70步
乌龟-->跑了71步
乌龟-->跑了72步
乌龟-->跑了73步
乌龟-->跑了74步
乌龟-->跑了75步
乌龟-->跑了76步
乌龟-->跑了77步
乌龟-->跑了78步
乌龟-->跑了79步
乌龟-->跑了80步
乌龟-->跑了81步
乌龟-->跑了82步
乌龟-->跑了83步
乌龟-->跑了84步
乌龟-->跑了85步
乌龟-->跑了86步
乌龟-->跑了87步
乌龟-->跑了88步
乌龟-->跑了89步
乌龟-->跑了90步
乌龟-->跑了91步
乌龟-->跑了92步
乌龟-->跑了93步
乌龟-->跑了94步
乌龟-->跑了95步
乌龟-->跑了96步
乌龟-->跑了97步
乌龟-->跑了98步
兔子-->跑了10步
兔子-->跑了11步
兔子-->跑了12步
兔子-->跑了13步
兔子-->跑了14步
兔子-->跑了15步
兔子-->跑了16步
兔子-->跑了17步
兔子-->跑了18步
兔子-->跑了19步
乌龟-->跑了99步
winner is乌龟

Process finished with exit code 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bug_keng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值