1 继承Thread类,重写run方法(不推荐,因为java的单继承局限性)
package study_02;
/*
* 继承Thread类,重写run方法
*
*/
public class TestThread extends Thread{
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println("coding");
}
}
public static void main(String[] args) {
TestThread t = new TestThread();
t.start();//开启线程,交给cpu调用
for (int i = 0; i < 20; i++) {
System.out.println("singing");
}
}
}
多线程下载图片
下载器
package study_02;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import org.apache.commons.io.FileUtils;
public class WebDownloader {
private String url;
private String src;
public WebDownloader(String url, String src) {
this.url = url;
this.src = src;
}
public void downloader() throws Exception, IOException {
FileUtils.copyURLToFile(new URL(this.url), new File(this.src));
}
}
package study_02;
import java.io.IOException;
public class ThreadDownloader extends Thread {
private String url;
private String src;
public ThreadDownloader(String url, String src) {
this.url = url;
this.src = src;
}
@Override
public void run() {
WebDownloader wb = new WebDownloader(url, src);
try {
wb.downloader();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
ThreadDownloader t1 = new ThreadDownloader("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1560412446970&di=a46d4932a720a5ee5df0e0d437fa4a27&imgtype=0&src=http%3A%2F%2Fi1.hdslb.com%2Fbfs%2Farchive%2Fc6bf77b6be5b56000d7a67f952c58ac0a27c4bdb.jpg","32.jpg");
ThreadDownloader t2 = new ThreadDownloader("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1560412446970&di=a46d4932a720a5ee5df0e0d437fa4a27&imgtype=0&src=http%3A%2F%2Fi1.hdslb.com%2Fbfs%2Farchive%2Fc6bf77b6be5b56000d7a67f952c58ac0a27c4bdb.jpg","3.jpg");
ThreadDownloader t3 = new ThreadDownloader("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1560412446970&di=a46d4932a720a5ee5df0e0d437fa4a27&imgtype=0&src=http%3A%2F%2Fi1.hdslb.com%2Fbfs%2Farchive%2Fc6bf77b6be5b56000d7a67f952c58ac0a27c4bdb.jpg","5.jpg");
t3.start();
t1.start();
t2.start();
}
}
2 实现runnable接口(避免单继承的局限性,方便共享资源,推荐使用)
package study_02;
/*
* 实现runnable接口
*
*/
public class TestThread2 implements Runnable{
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println("coding");
}
}
public static void main(String[] args) {
TestThread t = new TestThread();//创建实现类对象
Thread s = new Thread(t);//创建代理类对象
// new Thread(new TestThread2()).start();//类对象只用一次的话可以这样匿名创建,不用声明应用
s.start();//开启线程,交给cpu调用
for (int i = 0; i < 20; i++) {
System.out.println("singing");
}
}
}
多线程下载图片
package study_02;
import java.io.IOException;
public class ThreadDownloader2 implements Runnable {
private String url;
private String src;
public ThreadDownloader2(String url, String src) {
this.url = url;
this.src = src;
}
@Override
public void run() {
WebDownloader wb = new WebDownloader(this.url, this.src);
try {
wb.downloader();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
new Thread(new ThreadDownloader2("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1560412446970&di=a46d4932a720a5ee5df0e0d437fa4a27&imgtype=0&src=http%3A%2F%2Fi1.hdslb.com%2Fbfs%2Farchive%2Fc6bf77b6be5b56000d7a67f952c58ac0a27c4bdb.jpg", "1.jpg")).start();;
new Thread(new ThreadDownloader2("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1560412446970&di=a46d4932a720a5ee5df0e0d437fa4a27&imgtype=0&src=http%3A%2F%2Fi1.hdslb.com%2Fbfs%2Farchive%2Fc6bf77b6be5b56000d7a67f952c58ac0a27c4bdb.jpg", "2.jpg")).start();;
new Thread(new ThreadDownloader2("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1560412446970&di=a46d4932a720a5ee5df0e0d437fa4a27&imgtype=0&src=http%3A%2F%2Fi1.hdslb.com%2Fbfs%2Farchive%2Fc6bf77b6be5b56000d7a67f952c58ac0a27c4bdb.jpg", "3.jpg")).start();;
}
}
3 实现callable接口
多线程下载图片
package study_02;
import java.io.IOException;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class ThreadDownloader3 implements Callable<Boolean> {
private String url;
private String src;
public ThreadDownloader3(String url, String src) {
this.url = url;
this.src = src;
}
@Override
public Boolean call()throws Exception {
WebDownloader wb = new WebDownloader(this.url, this.src);
wb.downloader();
return true;
}
public static void main(String[] args) throws InterruptedException, ExecutionException {
ThreadDownloader3 t3 = new ThreadDownloader3("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1560412446970&di=a46d4932a720a5ee5df0e0d437fa4a27&imgtype=0&src=http%3A%2F%2Fi1.hdslb.com%2Fbfs%2Farchive%2Fc6bf77b6be5b56000d7a67f952c58ac0a27c4bdb.jpg","2.jpg");
ThreadDownloader3 t2 = new ThreadDownloader3("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1560412446970&di=a46d4932a720a5ee5df0e0d437fa4a27&imgtype=0&src=http%3A%2F%2Fi1.hdslb.com%2Fbfs%2Farchive%2Fc6bf77b6be5b56000d7a67f952c58ac0a27c4bdb.jpg","3.jpg");
ThreadDownloader3 t1 = new ThreadDownloader3("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1560412446970&di=a46d4932a720a5ee5df0e0d437fa4a27&imgtype=0&src=http%3A%2F%2Fi1.hdslb.com%2Fbfs%2Farchive%2Fc6bf77b6be5b56000d7a67f952c58ac0a27c4bdb.jpg","4.jpg");
ExecutorService ser = Executors.newFixedThreadPool(3);//建立线程池
//提交任务
Future<Boolean> result1 = ser.submit(t1);
Future<Boolean> result2 = ser.submit(t2);
Future<Boolean> result3 = ser.submit(t3);
//获取结果
boolean r1 = result1.get();
boolean r2 = result2.get();
boolean r3 = result3.get();
//关闭服务
ser.shutdownNow();
}
}