目录
一、创建多线程的三种方式
1、继承Thread类
2、通过runnable接口创建
3、通过callable接口创建
package threadTest1;
/**
* @author daiy
* @create 2020-09-13-14:14
*/
//创建多线程方式1,继承thread类,重写run()方法,调用start()方法开启线程
public class ThreadDemo1 extends Thread{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("我是多线程---"+i);
}
}
public static void main(String[] args) {
//创建线程对象
ThreadDemo1 threadDemo1=new ThreadDemo1();
//调用start()方法
threadDemo1.start();
for (int i = 0; i < 700; i++) {
System.out.println("我是主方法---"+i);
}
}
}
①、执行main方法,可以看到打印结果为,说明两个线程是交替执行的(线程开启不一定立即执行,而是由cpu安排调度来执行的)。
②、通过多线程下载图片
package threadTest1;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
/**
* @author daiy
* @create 2020-09-13-14:48
*/
public class ThreadDemo2 extends Thread{
private String url;
private String name;
public ThreadDemo2 (String url,String name){
this.name=name;
this.url=url;
}
@Override
public void run() {
ThreadDowload threadDowload=new ThreadDowload();
threadDowload.dowload(url,name);
System.out.println(name+"正在下载。。。");
}
public static void main(String[] args) {
ThreadDemo2 td1=new ThreadDemo2("https://csdnimg.cn/cdn/content-toolbar/csdn-logo.png?v=20200416.1","1.jpg");
ThreadDemo2 td2=new ThreadDemo2("https://profile.csdnimg.cn/C/9/7/2_duochirou","2.jpg");
ThreadDemo2 td3=new ThreadDemo2("https://www.baidu.com/img/flexible/logo/pc/result.png","3.jpg");
td1.start();
td2.start();
td3.start();
}
}
class ThreadDowload{
//文件下载方法
public void dowload(String url,String name){
try {
FileUtils.copyURLToFile(new URL(url),new File(name));
} catch (IOException e) {
e.printStackTrace();
}
}
}
package threadTest1;
/**
* @author daiy
* @create 2020-09-13-15:24
*/
//创建线程方式2:实现runnable接口,重写run()方法
public class ThreadDemo3 implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("我是多线程---"+i);
}
}
public static void main(String[] args) {
//创建runnable接口实现类对象
ThreadDemo3 threadDemo3=new ThreadDemo3();
//创建线程对象,通过线程对象开启线程
Thread thread=new Thread(threadDemo3);
thread.start();
for (int i = 0; i < 700; i++) {
System.out.println("我是主方法---"+i);
}
}
}
package threadTest2;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.concurrent.*;
/**
* @author daiy
* @create 2020-09-13-18:39
*/
//多线程创建方式3:实现callable接口
public class TestCallable implements Callable {
private String url;
private String name;
public TestCallable (String url,String name){
this.name=name;
this.url=url;
}
@Override
public String call() {
ThreadDowload threadDowload=new ThreadDowload();
threadDowload.dowload(url,name);
System.out.println(name+"正在下载。。。");
return "下载完了啊";
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
TestCallable td1=new TestCallable("https://csdnimg.cn/cdn/content-toolbar/csdn-logo.png?v=20200416.1","1.jpg");
TestCallable td2=new TestCallable("https://profile.csdnimg.cn/C/9/7/2_duochirou","2.jpg");
TestCallable td3=new TestCallable("https://www.baidu.com/img/flexible/logo/pc/result.png","3.jpg");
//创建执行任务
ExecutorService ser= Executors.newFixedThreadPool(3);
//提交执行
Future submit1 = ser.submit(td1);
Future submit2 = ser.submit(td2);
Future submit3 = ser.submit(td3);
//获取结果
String str1 = submit1.get();
String str2 = submit2.get();
String str3 = submit3.get();
System.out.println(str1+"----"+str2+"-----"+str3);
//关闭服务
ser.shutdown();
}
}
class ThreadDowload{
//文件下载方法
public void dowload(String url,String name){
try {
FileUtils.copyURLToFile(new URL(url),new File(name));
} catch (IOException e) {
e.printStackTrace();
}
}
}