zoukankan      html  css  js  c++  java
  • 多线程01 --几种创建多线程的方式及比较

    多线程

    一、创建多线程的几种方式

    1. 继承Thread类
    2. 实现runable接口
    3. 实现callable接口

    注意:当创建一个线程后,调用的是start方法,会优先走主线程main;当调用的是run方法时,优先走run方法。线程的执行是CPU调度安排,故可能每次执行都不一样。

    使用comments-io jar包进行网图图下载:

    public class TestThread02 extends Thread {//通过继承Thread类
        private  String  url;//文件路径
        private String name;//文件名
    
        public TestThread02(String url, String name) {
            this.url = url;
            this.name = name;
        }
        @Override
        public void run() {
            WebDownloader webDownloader = new WebDownloader();
            webDownloader.downloader(url,name);
            System.out.println("成功下载了文件:" + name);
        }
    
        public static void main(String[] args) {
            TestThread02 thread01 = new TestThread02("http://b397.photo.store.qq.com/psb?/V12hC8Q41MsPgM/yUU7bLy1MWF*LcU*1VAkDFBvDfj2p4xK3ZktIrbQxCQ!/b/dI0BAAAAAAAA&bo=gAJyBAAAAAAFF8A!&rf=viewer_4", "1.png");
            TestThread02 thread02 = new TestThread02("http://b267.photo.store.qq.com/psb?/V12hC8Q41MsPgM/KLVrmeTeNTAexPoucX6asEYVUTDlPbkGuXn3.MkdguQ!/b/dAsBAAAAAAAA&bo=gAJyBAAAAAAFF8A!&rf=viewer_4", "2.png");
            TestThread02 thread03 = new TestThread02("http://b369.photo.store.qq.com/psb?/V12hC8Q41MsPgM/sWqqYGo32OLLNBZxB5595IRZpArbTRVod*KPEQ5pCNs!/b/dHEBAAAAAAAA&bo=gAJyBAAAAAAFF8A!&rf=viewer_4", "3.png");
    
            thread01.start();
            thread02.start();
            thread03.start();
        }
    }
    //下载器
    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方法出现问题");
            }
        }
    }
    
    public class TestCallable implements Callable<Boolean> { //通过实现Callable
        private  String  url;//文件路径						好处:1.可以定义返回值
        private String name;//文件名							  2.可以抛出异常
    
        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("http://b397.photo.store.qq.com/psb?/V12hC8Q41MsPgM/yUU7bLy1MWF*LcU*1VAkDFBvDfj2p4xK3ZktIrbQxCQ!/b/dI0BAAAAAAAA&bo=gAJyBAAAAAAFF8A!&rf=viewer_4", "1.png");
            TestCallable t2 = new TestCallable("http://b267.photo.store.qq.com/psb?/V12hC8Q41MsPgM/KLVrmeTeNTAexPoucX6asEYVUTDlPbkGuXn3.MkdguQ!/b/dAsBAAAAAAAA&bo=gAJyBAAAAAAFF8A!&rf=viewer_4", "2.png");
            TestCallable t3 = new TestCallable("http://b369.photo.store.qq.com/psb?/V12hC8Q41MsPgM/sWqqYGo32OLLNBZxB5595IRZpArbTRVod*KPEQ5pCNs!/b/dHEBAAAAAAAA&bo=gAJyBAAAAAAFF8A!&rf=viewer_4", "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();
            //关闭服务
            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方法出现问题");
            }
        }
    }
    

    继承Thread类和实现Runnable接口开启线程对比:

    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 thread01 = new TestThread01();
            //调用start方法开启线程
            thread01.start();
            for (int i = 0; i < 20; i++) {
                System.out.println("我在学习---------"+i);
            }
        }
    }
    
    public class TestThread03 implements Runnable{
        @Override
        public void run() {
            //run方法线程体
            for (int i = 0; i < 20; i++) {
                System.out.println("我在玩压缩---------"+i);
            }
        }
        //创建main方法 ,主线程
        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);
            }
        }
    }
    
    刚刚参加工作,很有很多不懂不会的,发现错误,欢迎指正,谢谢!
  • 相关阅读:
    rest framework 认证 权限 频率
    rest framework 视图,路由
    rest framework 序列化
    10.3 Vue 路由系统
    10.4 Vue 父子传值
    10.2 Vue 环境安装
    10.1 ES6 的新增特性以及简单语法
    Django 跨域请求处理
    20190827 On Java8 第十四章 流式编程
    20190825 On Java8 第十三章 函数式编程
  • 原文地址:https://www.cnblogs.com/xd-study/p/13038973.html
Copyright © 2011-2022 走看看