美文网首页
多线程创建的两种基本方法

多线程创建的两种基本方法

作者: 何几时 | 来源:发表于2020-11-20 21:26 被阅读0次

方法1 继承Thread()

继承Thread()类的多线程创建步骤

  1. 新建一个类继承 Thread()
  2. 重写 run() 方法
  3. main() 主函数里头创建新类的对象,调用 .start() 方法去实现

下载图片场景示例

package demo01_threadCreation;

import org.apache.commons.io.FileUtils;

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

// 练习Thread,实现多线程同步下载图片
// 线程类怎么写?
// 1.先继承 Thread 类,再重写 run() 方法,最后在 main() 内调用线程类对象的 start() 方法
public class TestThread2 extends Thread{
    private String url;  // 网络图片地址
    private String name; // 保存的文件名

    public TestThread2(String url, String name){
        this.name= name;
        this.url = url;
    }

    // 线程执行体
    @Override
    public void run() {
        WebDownloader wd = new WebDownloader();
        wd.downloader(url, name);
        System.out.println("下载了文件名名为:"+name+" 的图片文件");
    }

    public static void main(String[] args) {
        TestThread2 tt1 = new TestThread2("http://www.kuangstudy.com/assert/images/index_topleft_logo_black.png", "1.png");
        TestThread2 tt2 = new TestThread2("http://www.kuangstudy.com/assert/images/index_topleft_logo_black.png", "2.png");
        TestThread2 tt3 = new TestThread2("http://www.kuangstudy.com/assert/images/index_topleft_logo_black.png", "3.png");

        tt1.start();
        tt2.start();
        tt3.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异常,downloader方法错误");
        }
    }
}

方法2 实现 Runnable 接口

实现 Runnable 接口的多线程创建步骤

  1. 新建一个类实现 Runnable
  2. 重写 run() 方法
  3. 执行线程需要丢入Runnable接口new出实现类对象,调用对象的start方法(在 main() 主函数里头创建新类的对象,再把对象作为参数传入 Thread() 括号中进行静态代理,再调用 .start() 方法去实现)

下载图片场景示例

package demo01_threadCreation;

import org.apache.commons.io.FileUtils;

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

// 练习Thread,实现多线程同步下载图片
// 线程类怎么写?
// 1.先继承 Thread 类,再重写 run() 方法,最后在 main() 内调用线程类对象的 start() 方法
public class TestThread2_1_Runnable implements Runnable{
    private final String url;  // 网络图片地址
    private final String name; // 保存的文件名

    public TestThread2_1_Runnable(String url, String name){
        this.name= name;
        this.url = url;
    }

    // 线程执行体
    @Override
    public void run() {
        WebDownloader wd = new WebDownloader();
        wd.downloader(url, name);
        System.out.println("下载了文件名名为:"+name+" 的图片文件");
    }

    public static void main(String[] args) {
        TestThread2 tt1 = new TestThread2("http://www.kuangstudy.com/assert/images/index_topleft_logo_black.png", "1.png");
        TestThread2 tt2 = new TestThread2("http://www.kuangstudy.com/assert/images/index_topleft_logo_black.png", "2.png");
        TestThread2 tt3 = new TestThread2("http://www.kuangstudy.com/assert/images/index_topleft_logo_black.png", "3.png");

        new Thread(tt1).start();
        new Thread(tt2).start();
        new Thread(tt3).start();

    }

}

实现 Runnable 接口方法更好

image-20201120212420191.png

课后疑问

静态代理是什么鬼?为什么能把一个对象像参数一样传入类构造器来new一个新对象

TestThread2 tt1 = new TestThread2("http://www.kuangstudy.com/assert/images/index_topleft_logo_black.png", "1.png");
new Thread(tt1).start();

相关文章

网友评论

      本文标题:多线程创建的两种基本方法

      本文链接:https://www.haomeiwen.com/subject/kuujiktx.html