0
点赞
收藏
分享

微信扫一扫

多线程学习day1

niboac 2022-02-08 阅读 52

如何创建多线程

  1. 通过Thread class —-继承Thread类*
  2. Runnable接口—-实现Runnable接口*
  3. Callable接口———实现Callable接口

Thread类
新建一个类TestThread1 并继承Thread类 Thread类实现了Runnable接口
重写run方法并在run里编写执行体
在主函数里创建TestThread1对象并调用star()方法开启多线程 如调用run()方法则正常由上到下执行

public class TestThread1 extends Thread{
    public void run(){
        for(int i =0;i <200; i++){
            System.out.println("a--"+i);
        }
    }
    public static void main(String[] args){
        //main线程,主线程
        //创建一个线程对象
        TestThread1 testThread1 = new TestThread1();
        //调用start()方法开启 这个new了的线程 
        testThread1.start();
        for(int i =0;i< 2000; i++){
            System.out.println("aaaaaaaaaaaa----"+i)
        }
    }
}

运行结果 可以看到二者是交替出现运行结果

二 图片下载器

需要commons.io包,自行百度下载。

代码如下

package com.cy;

import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.net.URL;

public class demo2 extends Thread{ //extends Thread可替换为 implements Runnable ,如更改,start需要使用  new Thread(Runnable对象).start();进行调用
    private String url;      //网络图片地址
    private String name;     //保存的文件名

    //封装
    public demo2(String url, String name){
        this.name =name;
        this.url =url;
    }

    @Override
    //下载执行体
    public void run() {
        Webdownloader webdownload1 =new Webdownloader();
        webdownload1.download(url,name); //新建webdownloader对象并调用其中的download方法
        System.out.println("下载完成,文件名为"+name);
    }
//主函数
    public static void main(String[] args) {
        demo2 demo21 =new demo2("https://img-bss.csdn.net/1643265395158.png","csdn图片1.jpg");    //新建对象并传递图片网址与图片名称,再调用star方法执行
        demo2 demo22 =new demo2("https://img-bss.csdn.net/1643265395158.png","csdn图片2.jpg");
        demo2 demo23 =new demo2("https://img-bss.csdn.net/1643265395158.png","csdn图片3.jpg");
      demo21.start();//如实现Runnable则改为 new Thread(demo21).start();
      demo22.start();//如实现Runnable则改为 new Thread(demo22).start();
      demo23.start();//如实现Runnable则改为 new Thread(demo23).start();
    }
}
//下载器的创建
class Webdownloader{
    public void download(String url,String name){         //创建下载器类并调用commons.io.FileUtils下载
        try {
            FileUtils.copyURLToFile(new URL(url),new File(name));    //调用下载方法并传递两个String参数,分别是URL与File (URL会报错,需要异常捕获)
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("IO异常--download");
        }
    }
}

代码执行思路

  • 首先导入commons.io包,创建下载器模块:调用FileUtils.copyURLToFile(new URL(url),new File(name));方法,url与file为网络图片地址与保存的文件名。这里需要异常捕获
  • 创建一个demo2类新建两个变量url与file 并封装
  • 因为demo2继承了Thread,必须重写run()方法,把下载器执行体写在run()里,给个回执。
  • 创建主函数并新建demo2对象(给两个String变量赋值)
  • 使用对象名.star();来启动下载

运行结果为demo2
可见三个下载线程并不是从上到下依次执行的,而是同时执行下载。哪个先下载完就先报回执。

三 实现Runnable接口

Runnable与Thread大体上一样,只不过在启动方法方面需要配合Thread进行启动
简要代码如下

package com.cy;
//实现Runnable接口,重写run方法,执行线程需要丢入Runnable接口实现类,调用start方法
public class demo3 implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 30; i++) {
            System.out.println("Runnable"+i);   //run()里写个循环体
        }
    }
    public static void main(String[] args) {
        demo3 d3=new demo3();       //创建Runnable对象
        new Thread(d3).start();     //Runnable无法直接start(),所以要配合Thread进行启动 格式为   new Thread(Runnable对象).start();
        for (int i = 0; i < 200; i++) {
            System.out.println("RunnableRunnableRunnable"+i);
        }
    }
}

运行结果如下(部分):Runnable

Runnable无法直接调用start(),所以要配合Thread进行启动 格式为 new Thread(Runnable对象).start();

举报

相关推荐

leetcode 学习day1

Python学习day1

Vue学习Day1

Java学习Day1

深度学习 Day1

flask学习-day1

每日学习day1

前端学习 day1

RHCSA学习笔记 day1

0 条评论