当前位置 博文首页 > Welcome to 七元K home page:??Java面试高频词《多线程》(建议

    Welcome to 七元K home page:??Java面试高频词《多线程》(建议

    作者:[db:作者] 时间:2021-09-12 18:04

    Java多线程(详解+示例)

    目录:

    01、线程简介

    任务、进程、线程、多线程

    02、线程实现(重点)

    继承Thread类、实现Runnable接口、实现Callable接口

    03、线程状态

    04、线程同步(重点)

    05、线程通讯问题

    06、高级主题


    02、线程实现:

    1.继承Thread类:将一个类声明为一个Thread的子类,子类重写run类的方法Thread,然后分配并启动子类的实例

    (1).自定义线程类继承Thread类
    (2).重写run()方法,编写线程执行体
    (3).创建线程对象,调用start()方法启动线程

    使用extends

    代码示例:

    package Demo01;
    //创建线程方式一:Thread类
    //总结:注意,线程开启不一定立即执行,由CPU调度执行
    public class TestThread01 extends Thread {
        @Override
        public void run() {
            //run方法线程体
            //super.run();
            for(int i=0;i<20;i++)
            {
                System.out.println("你好"+i);
            }
        }
    
        public static void main(String[] args) {
            //创建线程对象
            TestThread01 testThread01=new TestThread01();
            //调用start方法
            testThread01.run();//正常逻辑输出
            System.out.println("==============================");
            testThread01.start();//同时进行
    
            //main线程---也就是主方法
            for (int i = 0; i < 1000; i++) {
                System.out.println("多线程"+i);
                
            }  
    
        }
    }
    

    示例:使用继承Thread类实现网图下载

    package Demo01;
    
    import org.apache.commons.io.FileUtils;
    
    import java.io.File;
    import java.io.IOException;
    import java.net.URL;
    
    //实现多线程同步下载图片
    public class TestThread02 extends 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 t1=new TestThread02("http://b-ssl.duitang.com/uploads/item/201704/21/20170421083329_3cxt8.png","1.png");
            TestThread02 t2=new TestThread02("https://i02piccdn.sogoucdn.com/7e1dad42a62db2df","2.png");
            TestThread02 t3=new TestThread02("https://i01piccdn.sogoucdn.com/f13b319fd77655ec","3.png");
    
          //obj.start()----同时进行的,输出结果没有顺序
            t1.start();
            t2.start();
            t3.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异常,down的方法出现问题!");
            }
        }
    
    }
    

    2.实现Runable接口:声明实现类Runnable接口。 那个类然后实现了run方法。 然后可以分配类的实例,在创建Thread时作为参数传递,并启动。创建线程方式2:
    (1).实现runable接口
    (2).重写run方法,执行线程对象需要丢入runnable接口的实现类
    (3). 调用strat();
    使用implements

    代码示例:

    package Demo01;
    
    public class TestThread03 implements Runnable {
        @Override
        public void run() {
    
            for(int i=0;i<20;i++)
            {
                System.out.println("你好"+i);
            }
        }
    
        public static void main(String[] args) {
            //创建runnabla接口的实现类对象
            TestThread03 testThread03=new TestThread03();
            //创建线程对象,通过线程对象来开启我们的线程---代理
            // Thread thread=new Thread();
            // thread.start();
            //以上两行代码等价下面的一行代码
            //执行线程对象丢入runnable接口的实现类如下testThread03)
            new Thread(testThread03).start(); //同时进行
    
            for (int i = 0; i < 1000; i++) {
                System.out.println("多线程"+i);
    
            }
    
        }
    
    }
    
    

    示例:使用implements实现Thread类实现网图下载

    package Demo01;
    
    import org.apache.commons.io.FileUtils;
    
    import java.io.File;
    import java.io.IOException;
    import java.net.URL;
    
    public class TestThread04 implements Runnable {
        private String url;  //网络图片地址
        private String name; //保存的文件名
    
        //构造器--实现调用
        public TestThread04(String url,String name){
            this.url=url;
            this.name=name;
    
        }
    
        //下载图片的执行体
        @Override
        public void run() {
            WebDownloader webDownloaderw=new WebDownloader();
            //传入方法
            webDownloaderw.downloader(url,name);
            System.out.println("下载的文件名为"+name);
        }
    
        public static void main(String[] args) {
            TestThread04 t1=new TestThread04("http://b-ssl.duitang.com/uploads/item/201704/21/20170421083329_3cxt8.png","1.png");
            TestThread04 t2=new TestThread04("https://i02piccdn.sogoucdn.com/7e1dad42a62db2df","2.png");
            TestThread04 t3=new TestThread04("https://i01piccdn.sogoucdn.com/f13b319fd77655ec","3.png");
    
            new Thread(t1).start();
            new Thread(t2).start();
            new Thread(t3).start();
        }
    }
    
    //下载器
    class WebDownloader04{
        //下载---方法
        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异常,down的方法出现问题!");
            }
        }
    
    }
    

    小结:

    1.继承Threa类:

    (1)子类继承Thread类具备多线程能力

    (2)启动线程:子类对象.start()

    (3)不建议使用,避免OOP单继承局限性

    2.实现Runable接口

    (1)实现接口Runable具有多线程能录

    (2)启动线程:传入目标对象+Thread对象.start()

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


    并发问题

    代码示例

    package