多线程
创建启动一个线程
创建一个线程大概分为下面几步
- 自定义线程类继承Thread类
- 重写run方法,编写线程执行体
- 创建线程对象,调用start方法启动线程
在继承Thread类时,首先要重写run方法,即把需要在多线程里面实现的逻辑写到run方法中
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 | public class MyThread extends Thread{
    @Override
    public void run() {
        // run方法
        for (int i = 0; i < 20; i++) {
            System.out.println("我在看代码!");
        }
    }
    public static void main(String[] args) {
        // main线程
        // 创建一个线程
        MyThread mt = new MyThread();
        // 调用start来开启线程
        mt.start();
        
        // 程序还是串行执行的
        mt.run();
        for (int i = 0; i < 20; i++) {
            System.out.println("主线程");
        }
    }
}
 | 
 
与run方法不同的是,start方法会额外开启一个新的线程来执行run方法里面的逻辑,而调用run缺不会额外开启一个新的线程。
多线程下载器
把一些业务逻辑放在run方法里面,我们就可以使用多线程来进行一些业务逻辑处理。
首先构建好一个下载器
| 1
2
3
4
5
6
7
8
9
 | class DownLoad{
    public void downloader(String url, String name) {
        // 使用一个FileUtils包来进行书写
        try{
            FileUtils.copyURLToFile(new URL(url), new File(name));
        }catch(IOExpection e)
        	throw new RuntimeException(e);
    }
}
 | 
 
构建好下载器后就可以启动线程这些资源
还是三要素
- 继承Thread
- 重写run方法
- 在main线程中new Thread对象,调用start方法
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 | public class TestThread extends Thread {
    // 定义好name
    String name;
    String url;
    
    public TestThread(String name, String url) {
        // xxxx
    }
    public void run() {
        // 重写run函数
        // 使用下载器下载
        DownLoader d = new DownLoader();
        d.downloader(url, name);
    }
    public static void main(String[] args) {
        // 创建线程
        TestThread t1 = new TestThread(xxx, xxx);
        TestThread t2 = new TestThread(xxx, xxx);
        
        // 启动start
        t1.start();
        t2.start();
    }
}
 | 
 
这样就可以下载好图片。