创建多线程
利用继承Thread类创建线程的步骤:
- 自定义类要继承Thread类。
- 重写run()方法,并编写执行体
- 创建线程对象,调用start()方法启动程序
如图所示,多线程是各个线程并发执行,在主线程这里是main()执行时,系统并发执行子线程中的run()方法
这里新建了一个ThreadTest类继承Thread类,并在类中重写run()方法,而后在main()方法中start()运行该线程。这里不能直接在main()中调用run()方法,如果不用start(),直接调用run()方法就是普通的调用类中的方法,不是多线程。
public class ThreadTest extends Thread{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("看kankan书"+i);
}
}
public static void main(String[] args) {
ThreadTest threadTest = new ThreadTest();
threadTest.start();
for (int i = 0; i < 1000; i++) {
System.out.println("玩耍"+i);
}
}
}
这里子线程因为不一定立即执行,当主线程循环较少,执行事件短暂的话,结果可能就会显示成主线程执行结果加上子线程的结果,此时线程的并发执行就会不明显。就如同不用start()方法调用,而直接使用run()方法。
创建线程的另一种方法
利用实现runnable接口完成线程的创建
用类实现Runnable接口,并重写run()方法,在创建线程时实例化类并用Thread中的start()方法执行线程
public class ThreadTest3 implements Runnable{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("看kankan书"+i);
}
}
public static void main(String[] args) {
ThreadTest3 threadTest3 = new ThreadTest3();
new Thread(threadTest3).start();
for (int i = 0; i < 1000; i++) {
System.out.println("玩耍"+i);
}
}
}
结果显示也得出了线程的并发
多线程的案例
我么可以利用多线程的特点去同时下载3个图片,首先我们需要一个jar包去调用下载图片的方法,下载地址:https://mvnrepository.com/artifact/commons-io/commons-io/2.4
这里我们建立三个子线程,三个子线程同时都做下载图片的事
public class ThreaTest1 extends Thread{
private String url;//下载的网址
private String name;//下载完成之后给他的一个名字
public ThreaTest1(String url,String name){
this.url=url;
this.name=name;
}
@Override//重写run函数
public void run() {
Downloader downloader = new Downloader();
downloader.downloader(url,name);
System.out.println("下载"+name);
}
public static void main(String[] args) {
//新建三个子线程
ThreaTest1 t1 = new ThreaTest1("https://img-blog.csdnimg.cn/2021031618561839.png#pic_center","1.jpg");
ThreaTest1 t2 = new ThreaTest1("https://img-blog.csdnimg.cn/20210317190752665.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81NjE4MDE1Mw==,size_16,color_FFFFFF,t_70#pic_center","2.jpg");
ThreaTest1 t3 = new ThreaTest1("https://img-blog.csdnimg.cn/20210317185937859.png#pic_center","3.jpg");
//三个子线程执行
t1.start();
t2.start();
t3.start();
}
}
//下载器,用来下载图片的地址
class Downloader{
public void downloader(String url,String name){
try {
FileUtils.copyURLToFile(new URL(url),new File(name));
} catch (IOException e) {
e.printStackTrace();
System.out.println("方法出现异常");
}
}
}
从结果可以看出三张图片同时下载了下来,也可以使用第二种方法去下载,推荐用第二种。