如何创建多线程
- 通过Thread class —-继承Thread类*
- Runnable接口—-实现Runnable接口*
- 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();来启动下载
运行结果为
可见三个下载线程并不是从上到下依次执行的,而是同时执行下载。哪个先下载完就先报回执。
三 实现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无法直接调用start(),所以要配合Thread进行启动 格式为 new Thread(Runnable对象).start();