linyangde

导航

 

创建线程

方法一:继承Thread类( extends Thread ),重写run()方法,调用start开启线程

public class TestThread01 extends Thread{
    @Override
    public void run() {
        //run方法线程体
        for (int i = 0; i < 20; i++) {
            System.out.println("我在看代码---"+i);
        }
    }
    //main线程,主线程
    public static void main(String[] args) {
        //创建一个线程对象
        TestThread01 testThread01 = new TestThread01();  //------------------------------------>核心
        //调用start()方法开启线程
        testThread01.start();
        for (int i = 0; i < 20; i++) {
            System.out.println("我在学习多线程---"+i);
        }
    }
}

方法二:实现runnable接口( implements Runnable ),重写run方法,执行线程需要丢入runnable接口实现类,调用start方法

public class TestThread03 implements Runnable{
    @Override
    public void run() {
        //run方法线程体
        for (int i = 0; i < 20; i++) {
            System.out.println("我在看代码---"+i);
        }
    }
    public static void main(String[] args) {
        //创建runnable接口的实现类对象
        TestThread03 testThread03=new TestThread03();
        //创建线程对象,通过线程对象来开启线程,代理
        /*Thread thread = new Thread(testThread03);
        thread.start();
        可简化为以下代码*/
        new Thread(testThread03).start();  //------------------------------------>核心
        for (int i = 0; i < 20; i++) {
            System.out.println("我在学习多线程---"+i);
        }

    }
}

方法三:实现Callable接口( implements Callable) (了解)

public class TestCallable implements Callable {
    private String url;//网络图片地址
    private String name;//保存的文件名

    public TestCallable(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 {
        TestCallable t1=new TestCallable("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Ftalent.sciencenet.cn%2Fupload%2F2015%2F20151225141821148.jpg&refer=http%3A%2F%2Ftalent.sciencenet.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1664623789&t=637678cda384697e9fd7a2e7707dbad5","666.jpg");
        TestCallable t2=new TestCallable("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Ftalent.sciencenet.cn%2Fupload%2F2015%2F20151225141821148.jpg&refer=http%3A%2F%2Ftalent.sciencenet.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1664623789&t=637678cda384697e9fd7a2e7707dbad5","678.jpg");
        TestCallable t3=new TestCallable("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Ftalent.sciencenet.cn%2Fupload%2F2015%2F20151225141821148.jpg&refer=http%3A%2F%2Ftalent.sciencenet.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1664623789&t=637678cda384697e9fd7a2e7707dbad5","615.jpg");

        //创建执行服务:---------------------------------------------------------->重点
        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();
        //----------------------------------------------------------------------->重点
    }
}
//下载器
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异常,downloader方法错误!");
        }
    }
}

一般情况下使用方法二

多线程操作

  • 多个线程操作同一个对象时数据紊乱,线程不安全,会出现并发异常
  • 可用Thread.sleep方法模拟延迟
posted on 2022-09-02 22:00  Der_Der  阅读(59)  评论(0)    收藏  举报