在Java里面创建线程有三种方式
继承Thread类(少用继承)
实现Runnable接口(多用实现)
实现Callable接口(用的不多)
继承Thread类
将一个类声明为一个Thread的子类,子类重写run类的方法Thread,然后分配并启动子类的实例
简单说:
1、继承Thread类
2、重写run方法(run是子线程的入口点)
3、通过start方法启动线程
/**
* 创建线程方式一
* 1、创建:继承Thread+重写run
* 2、启动:创建子类对象+start
*/
public class StartThread extends Thread{
//线程入口点
public void run() {
for(int i=0;i<40;i++) {
System.out.println("一边听歌");
}
}
public static void main(String[] args) {
//创建子类对象,调用子类对象的Start方法
StartThread st = new StartThread();
//启动
st.start();//不保证立即运行 cpu调用
//st.run();//普通方法调用
for(int i=0;i<40;i++) {
System.out.println("一边coding");
}
}
}
执行线程必须调用start(),加入到调度器中
不一定立即执行,系统安排调度分配执行
直接调用run()不是开启多线程,是普通方法调用
示例:下载图片
下载工具
/**
* 下载图片
*/
public class WebDownloader {
//下载工具
public static void download(String url,String name) {
try{
FileUtils.copyURLToFile(new URL(url),new File(name));
}catch (MalformedURLException e) {
e.printStackTrace();
System.out.println("不合法的URL");
}
catch (IOException e) {
e.printStackTrace();
System.out.println("下载失败");
}
}
}
下载图片
public class TDownloader extends Thread {
private String file;// 远程路径
private String name;// 存储名字
//构造器
public TDownloader(String file, String name) {
super();
this.file = file;
this.name = name;
}
public void run() {
WebDownloader wd = new WebDownloader();
wd.download(file,name);
System.out.println(name);
}
public static void main(String[] args) {
TDownloader td1 = new TDownloader("http://img.52z.com/upload/news/image/20180621/20180621055751_46640.jpg", "phone.jpg");
TDownloader td2 = new TDownloader("http://i1.umei.cc/uploads/tu/201709/9999/c844c4e828.jpg", "cat.jpg");
TDownloader td3 = new TDownloader("http://img5q.duitang.com/uploads/item/201204/02/20120402164931_SjENc.jpeg", "dog.jpg");
//启动三个线程
td1.start();
td2.start();
td3.start();
}
}