方法一:1.1Thread Class→继承Thread类

//创建线程方式一:继承Thread的类,重写run()方法,调用start方法开启线程
//总结:线程开启线程不一定立即执行,由cpu调度执行

public class Thread_sttudy extends Thread
{
    @Override
    public void run() {
        //run方法线程体
        for(int i=0;i<20;i++)
        {
            System.out.println("我在看代码--"+i);
        }
    }

    public static void main(String[] args)
    { //main线程,主线程

        //创建一个线程对象
        Thread_sttudy Thread1=new Thread_sttudy();

        //调用start()方法开启线程
        Thread1.start();

        for(int i=0;i<20;i++)
        {
            System.out.println("我在看网课---"+i);
        }
    }
}1.2 为什么创建线程要调用start方法而不是run方法?

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/bdd94ea2-b238-4eb4-8aab-17270b6e15c3/Untitled.png

//调用start()方法开启线程
   Thread1.start();
/*
 (1)
public synchronized void start() {
    start0();
 }
  (2)
 start0()是本地方法,是JVM调用,底层是c/c++实现的
 真正实现多线程的效果,是start0(),而不是run
 private native void start0();
        

1.3 网图下载测试Thread的start()方法

package top.ltyzqhh.thread.study;

import org.apache.commons.io.FileUtils;

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

//练习Thread,实现多线程同步下载图片
public class PhotoDowload extends Thread{

    private String url;//网络图片地址
    private String name;//保存的文件名

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

    public void run() {
        WebDowload webDowload = new WebDowload();
        webDowload.download(url,name);
        System.out.println("下载了文件名为"+name);
    }

    public static void main(String[] args) {
        PhotoDowload Thread1=new PhotoDowload("<https://i0.hdslb.com/bfs/feed-admin/377590bd3a7c97a4d20511327cf51e2ce40f47f7.jpg@880w_388h_1c_95q","1.jpg>");
        PhotoDowload Thread2=new PhotoDowload("<https://i0.hdslb.com/bfs/feed-admin/377590bd3a7c97a4d20511327cf51e2ce40f47f7.jpg@880w_388h_1c_95q","2.jpg>");
        PhotoDowload Thread3=new PhotoDowload("<https://i0.hdslb.com/bfs/feed-admin/377590bd3a7c97a4d20511327cf51e2ce40f47f7.jpg@880w_388h_1c_95q","3.jpg>");

        
        Thread1.start();
        Thread2.start();
        Thread3.start();
    }
}

//下载器
class WebDowload {
    //下载方法
    public void download(String url,String name){
        try {
            FileUtils.copyURLToFile(new URL(url),new File(name));
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("IO异常,download方法出现问题");
        }

    }
}

需要导入以下包

download_io.cgi

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/79d2338b-83e7-4b13-b98f-b5c0c9c07134/JUGDIKC2XMGSX_AXRVSSX.png


方法二、2.1 实现Runnable接口

2.2使用方法二,就使用了一个叫[代理模式],静态代理

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/c4cc1741-c38a-499d-a34f-35a697e93927/.png

思考:在实现Runnable接口实现多线程的方式中, Thread thread =new Thread(t1); 相当于这个图中的商店,而实现了runnable这个接口的类则是相当于顾客,Thread类当中的的start()方法则相当于渠道。 而这个产品就相当于创建线程