多线程-线程创建(一)

多线程-线程创建(一)

  1. 程序:是指令和数据的有序集合,其本身没有任何运行的含义,是一个惊态的概念。

  2. 进程(Process):是执行程序的一次执行过程,它是一个动态的概念,是系统资源分配的单位。通常在一个进行可以包含诺干个线程,当然一个进行中至少有一个线程,不然没有存在的意义,线程是CPU调度和执行的单位。

  3. 线程(Thread):线程就是独立的执行路径

    • 在程序运行时,即使自己没有创建线程,后台也会有多个线程,如主线程,gc线程;
    • main()称之为主线程,为系统的入口,用于执行整个程序
    • 在一个进程中,如果开辟了多个线程,线程的运行由调度器安排调度,调度器是与操作系统紧密相关的,先后顺序是不能人为干涉的
    • 对同一份资源操作时,会存在资源抢夺的问题,需要加入并发控制
    • 线程会带来额外的开销,如cpu调度时间,并发控制开销
    • 每个线程在自己的工作内存交互,内存控制不当会造成数据不一致。

    普通方法的调用和多线程:

在这里插入图片描述

  1. 线程创建的方法一:Threadclass 继承Thread类(重点)

    //创建线程方式一:继承Thread类,重写run方法,调用start开启线程
    
    //总结:注意,线程开启不一定立即执行,由CPU调度执行
    public class TestThread1 extends Thread{
          
          
        @Override
        public void run() {
          
          
            //run方法线程体
            for (int i = 0; i < 200; i++) {
          
          
                System.out.println("我在看代码--------"+i);
            }
        }
    
        public static void main(String[] args) {
          
          
            //main线程,主线程
            //创建一个多线程对象
            TestThread1 testThread1=new TestThread1();
    
            //调用start()方法开启线程
            testThread1.start();//start()是同时执行的
    
            for (int i = 0; i < 1000; i++) {
          
          
                System.out.println("我在学习多线程--"+i);
            }
        }
    }
    
    
  2. 下载图片,联系Thread

    • 先去下载commons-io包,把这个jar包导进项目,具体可以参考Apache IO包的下载,我们代码需要用到FileUtils类的copyURLToFile()方法(拷贝一个URL到文件)。

    • 找出你要下载图片的地址,以方便我们代码实现。

在这里插入图片描述

  • 具体的代码实现

    import org.apache.commons.io.FileUtils;
    
    import java.io.File;
    import java.io.IOException;
    import java.net.URL;
    
    //练习Thread,实现多线程同步下载图片
    public class TestThread2 extends Thread {
          
          
        private String url;//网络图片地址
        private String name;//保存的文件名
    
        public TestThread2(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) {
          
          
            TestThread2 t1=new TestThread2("https://img-blog.csdnimg.cn/20210316213155604.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1h1bl9pbmRlcGVuZGVudA==,size_16,color_FFFFFF,t_70#pic_center","1.jpg");
            TestThread2 t2=new TestThread2("https://img-blog.csdnimg.cn/20210316213209625.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1h1bl9pbmRlcGVuZGVudA==,size_16,color_FFFFFF,t_70#pic_center","2.jpg");
            TestThread2 t3=new TestThread2("https://img-blog.csdnimg.cn/20210316213228816.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1h1bl9pbmRlcGVuZGVudA==,size_16,color_FFFFFF,t_70#pic_center","3.jpg");
    
            //先下载t1
            t1.start();
            //然后是t2
            t2.start();
            //最后是t3
            t3.start();
            //但是事实不是按顺序的,start()是同时进行的,谁先下载要取决于cpu的安排调度
        }
    }
    
    //下载器
    class WebDownloader{
          
          
        //下载方法
        public void downloader(String url,String name){
          
          
            try {
          
          
                //copyURLToFile()拷贝一个URL到文件
                FileUtils.copyURLToFile(new URL(url),new File(name));
            } catch (IOException e) {
          
          
                e.printStackTrace();
                System.out.println("IO异常,downloader方法出现问题");
            }
        }
    }
    
  • 图片下载成功

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Xun_independent/article/details/114938880