继承Thread类, 重写run()方法, 调用start()开启线程
If this thread was constructed using a separate Runnable run object, then that Runnable object‘s run method is called; otherwise, this method does nothing and returns.
Causes this thread to begin execution; the Java Virtual Machine calls the run method of this thread.
线程开启不一定立即执行, 由CPU调度执行
package com.shu.thread;
public class ThreadDemo01 extends Thread{
@Override
public void run() {
// run方法线程体
for(int i = 0; i < 200; i++){
System.out.println("AAAAAAAAAAAAAAAAA" + i);
}
}
public static void main(String[] args) {
new ThreadDemo01().start();
// new ThreadDemo01().run();
for (int i = 0; i < 1000; i++) {
System.out.println("BBBBBBBBBBBBBBBB" + i);
}
}
}
通过Thread下载图片
package com.shu.thread;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
public class ThreadDemo02 extends Thread{
private String url; // 网络图片地址
private String pathName; // 保存的文件名
public ThreadDemo02(String url, String pathName){
this.url = url;
this.pathName = pathName;
}
@Override
public void run() {
WebDownLoader webDownLoader = new WebDownLoader();
webDownLoader.downloader(url, pathName);
System.out.println("下载了文件名为: " + pathName);
}
// 实现多线程同步下载图片
public static void main(String[] args) {
ThreadDemo02 threadDemo0201 = new ThreadDemo02("https://i.cnblogs.com/assets/adminlogo.gif", "src/com/shu/thread/adminlogo.gif");
ThreadDemo02 threadDemo0202 = new ThreadDemo02("https://pic2.zhimg.com/80/v2-8df0e1ada7af09d3c62f2ba5ec4e4266_1440w.jpg", "src/com/shu/thread/xiyan.jpg");
ThreadDemo02 threadDemo0203 = new ThreadDemo02("https://pic1.zhimg.com/80/v2-b3972560b6f5b7ecfac44b3ceb78d134_1440w.jpg", "src/com/shu/thread/xingkong.jpg");
ThreadDemo02 threadDemo0204 = new ThreadDemo02("https://pic3.zhimg.com/80/v2-0a80487d102fa8f4323279779e7ee940_1440w.jpg", "src/com/shu/thread/yekong.jpg");
threadDemo0201.start();
threadDemo0202.start();
threadDemo0203.start();
threadDemo0204.start();
}
}
// 下载器
class WebDownLoader{
// 下载方法
public void downloader(String url, String pathName){
try {
FileUtils.copyURLToFile(new URL(url), new File(pathName));
} catch (IOException e) {
e.printStackTrace();
System.out.println("IO异常, downloader方法出现问题");
}
}
}
package com.shu.thread;
public class CreateThreadByRunnable implements Runnable{
@Override
public void run() {
// run方法线程体
for(int i = 0; i < 200; i++){
System.out.println("AAAAAAAAAAAAAAAAA" + i);
}
}
public static void main(String[] args) {
// 创建线程对象, 通过线程对象来开启我们的线程, 代理
new Thread(new CreateThreadByRunnable()).start();
for (int i = 0; i < 1000; i++) {
System.out.println("BBBBBBBBBBBBBBBB" + i);
}
}
}
package com.shu.thread;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.concurrent.*;
public class ThreadDemo03 implements Callable<Boolean> {
private String url; // 网络图片地址
private String pathName; // 保存的文件名
public ThreadDemo03(String url, String pathName){
this.url = url;
this.pathName = pathName;
}
@Override
public Boolean call() throws Exception {
WebDownLoader webDownLoader = new WebDownLoader();
webDownLoader.downloader(url, pathName);
System.out.println("下载了文件名为: " + pathName);
return true;
}
// 实现多线程同步下载图片
public static void main(String[] args) {
ThreadDemo03 threadDemo0301 = new ThreadDemo03("https://i.cnblogs.com/assets/adminlogo.gif", "src/com/shu/thread/adminlogo.gif");
ThreadDemo03 threadDemo0302 = new ThreadDemo03("https://pic2.zhimg.com/80/v2-8df0e1ada7af09d3c62f2ba5ec4e4266_1440w.jpg", "src/com/shu/thread/xiyan.jpg");
ThreadDemo03 threadDemo0303 = new ThreadDemo03("https://pic1.zhimg.com/80/v2-b3972560b6f5b7ecfac44b3ceb78d134_1440w.jpg", "src/com/shu/thread/xingkong.jpg");
ThreadDemo03 threadDemo0304 = new ThreadDemo03("https://pic3.zhimg.com/80/v2-0a80487d102fa8f4323279779e7ee940_1440w.jpg", "src/com/shu/thread/yekong.jpg");
ExecutorService executorService = Executors.newFixedThreadPool(4);
Future<Boolean> result1 = executorService.submit(threadDemo0301);
Future<Boolean> result2 = executorService.submit(threadDemo0302);
Future<Boolean> result3 = executorService.submit(threadDemo0303);
Future<Boolean> result4 = executorService.submit(threadDemo0304);
try {
boolean r1 = result1.get();
boolean r2 = result2.get();
boolean r3 = result3.get();
boolean r4 = result4.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
executorService.shutdownNow();
}
}
原文:https://www.cnblogs.com/archershu/p/12937140.html