3类方式实现多线程

线程实现

1.继承Thread类

  • 子类继承Thread类具备多线程能力
  • 启动线程:子类对象.start()
  • 不建议使用:避免OOP单继承局限性

单继承局限性:
一个Thread只能够调用一次start方法,需要创建多个子类对象,再调用start方法,就是一个对象只能被一个线程使用.

样例:

public class testThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 200; i++) {
            System.out.println("重写run方法,线程执行啦!");
        }
    }

    public static void main(String[] args) {
        //main方法,是主线程
        //1创建一个线程对象
        testThread testThread1=new testThread();
        //2调用start()方法开启建立线程
        testThread1.start();
        for(int i=0;i<2000;i++){
            System.out.println("主线程执行啦!"); //结果:主线程与新线程交替执行,有CPU决定
        }
    }
}

2.实现Runnable接口

  • 实现Runnable具有多线程能力
  • 启动线程:传入目标对象(实现Runnable接口)+Thread对象.start()
  • 推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用.
    例如:
StartThread4 station =new StartThread4()//一份资源
//多个代理
new Thread(station,name:"小明").start()//name是线程的名字
new Thread(station,name:"老师").start()new Thread(station,name:"小红").start()

new Thread时可以同时设置线程的线程名,本质上是调用了Thread中另一个构造方法.


下面演示龟兔赛跑,使用Runnable接口实现多线程:

样例:


//Race跑道,模拟龟兔赛跑
public class Race implements Runnable {
    private static String winner;

    @Override
    public void run() {
        for (int i = 1; i <= 100; i++) {
            if (gameOver(i)) break;
            if (Thread.currentThread().getName().equals("兔子") && i % 10 == 0) {
                try {
                    Thread.sleep(1);//让兔子睡一会
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(Thread.currentThread().getName() + "跑了" + i + "步");
        }
    }

    private boolean gameOver(int step) {
        if (winner != null) return true; //防止出现胜利者时,另一方还在跑,最终双方都跑到100步,就是出现胜者时就结束游戏
        if (step == 100) {
            winner = Thread.currentThread().getName();
            System.out.println(winner + "跑了100步赢了");
            return true;
        }
        return false;
    }

    public static void main(String[] args) {
        Race race = new Race();
        new Thread(race, "兔子").start();
        new Thread(race, "乌龟").start();
    }
}

3.实现callable接口(了解即可)

  • 可以自定义返回值的类型
  • 重写call方法,需要抛出异常
  • 创建目标对象
  • 创建执行服务:ExecutorService ser=Executors.newFixedThreadPool(1);
  • 提交执行:Future< Boolean >result1=ser.snbmit(t1);
  • 获取结果:boolean r1 =result1.get();
  • 关闭服务:ser.shutdownNow();

下面是使用Callable接口实例:

样例:
使用Callable接口实现网图下载

import org.apache.commons.io.FileUtils;//需要下载工具包commons.io包

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

/*实现Callable接口
1.可以定义返回值
 2.可以抛出异常
 */
public class TestCallable implements Callable<Boolean> {
    private String name; //保存的文件名
    private String url; //网图地址

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

    @Override
    public Boolean call() throws Exception { //重写call()方法,注意,是有返回值的,返回引用类型
        WebDownloader webdownloader = new WebDownloader();//在同一个类中定义另一个外类不需要导包
        webdownloader.downloader(url, name); //在call方法里使用下载器中的下载方法
        System.out.println("下载文件名为:" + name);
        return true;

    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        TestCallable t1 = new TestCallable("https://img1.baidu.com/it/u=562403570,2909796085&fm=26&fmt=auto", "1.jpg");
        TestCallable t2 = new TestCallable("https://img.lianzhixiu.com/uploads/allimg/202004/9999/324d3dc50d.jpg", "2.jpg");
        TestCallable t3 = new TestCallable("http://img.wmtp.net/wp-content/uploads/2020/09/1586ab0cbd2d4097aac31022bfe1da0e!400x400.jpeg", "3.jpg");
        ExecutorService ser = Executors.newFixedThreadPool(1);      //创建一个池子,服务
        Future<Boolean> result1 = ser.submit(t1); //提交线程1,执行
        Future<Boolean> result2 = ser.submit(t2);//提交线程2
        Future<Boolean> result3 = ser.submit(t3);//提交线程3
        boolean rs1 = result1.get(); //获取线程结果,都是true,因为在call方法中返回了true
        boolean rs2 = result2.get();
        boolean rs3 = result3.get();
        //关闭服务
        ser.shutdownNow();
    }
}

//网图下载器
class WebDownloader {
    //下载方法
    public void downloader(String url, String name) throws MalformedURLException {//url是图片的地址,name是下载命名
        //导入commons.io工具包后才可以使用FileUtils类
        try {
            FileUtils.copyURLToFile(new URL(url), new File(name));//下载图片
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("IO异常,downloder方法出现异常");//new URL时会出现异常
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值