1.继承Thread类
步骤:继承Thread类,重写run方法,调用start方法开启线程
//继承Thread类,重写run方法,调用start开启线程
//线程开启不一定立即执行,由CPU调度执行
public class TestThread01 extends Thread{
@Override
public void run() {
//run方法线程体
for (int i = 0; i < 999; i++) {
System.out.println("hi~" + i);
try {
this.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws InterruptedException {
//main线程 主线程
//创建一个线程对象
TestThread01 testThread01 = new TestThread01();
//调用start方法开启线程
testThread01.start();
for (int i = 0; i < 999; i++) {
System.out.println("hello~" + i);
}
}
}
多线程下载音乐
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
//实现多线程同步下载
public class TestThread02 extends Thread{
private String url; //目标地址
private String name; //文件名
public TestThread02(String url, String name){
this.url = url;
this.name = name;
}
//执行体
@Override
public void run() {
WebDownloader webDownloader = new WebDownloader();
webDownloader.downloader(url, name);
System.out.println("下载:" + name);
}
public static void main(String[] args) {
TestThread02 t1 = new TestThread02(
"https://m701.music.126.net/20220322211726/8eab9f7f69a76dc0106ab9b2dedc52a7/jdyyaac/obj/" +
"w5rDlsOJwrLDjj7CmsOj/11415974907/c9c2/8814/9787/d127ef89a95ba62b4bb7119aff9a646b.m4a", "1.m4a");
TestThread02 t2 = new TestThread02(
"https://m701.music.126.net/20220322211834/7bf7b044a9ba92db14c5afbccfedb971/jdyyaac/obj/" +
"w5rDlsOJwrLDjj7CmsOj/8834736110/2d25/de16/0c7f/7c40d2e0bb43d77b669a9bcde5bac3ab.m4a", "2.m4a");
TestThread02 t3 = new TestThread02(
"https://m701.music.126.net/20220322211904/f7735c2e49574d54d61eac54781a8b9c/jdyyaac/520e/" +
"065b/525c/ede61c33b0119969d265e69ae681c8db.m4a", "3.m4a");
t1.start();
t2.start();
t3.start();
}
}
//下载器
class WebDownloader{
//下载方法
public void downloader(String url, String name ){
try {
FileUtils.copyURLToFile(new URL(url), new File(name)); //需导入包commons-io
//地址:https://commons.apache.org/proper/commons-io/download_io.cgi
} catch (IOException e) {
e.printStackTrace();
System.out.println("下载方法出现问题");
}
}
}
小结
1.子类继承Thread类具备多线程能力
2.启动线程:子类对象.start()
3.不建议使用:避免OOP单继承局限性
2.实现Runnable接口
步骤:实现Runnable接口,重写run方法,调用start方法
//实现Runable接口,重写run方法,执行线程需要丢入runnable接口实现类,调用start方法
public class TestThread03 implements Runnable{
@Override
public void run() {
//run方法线程体
for (int i = 0; i < 999; i++) {
System.out.println("hi~" + i);
}
}
public static void main(String[] args){
//创建runnable接口实现类对象
TestThread03 testThread03 = new TestThread03();
//创建线程对象,通过线程对象开启线程
new Thread(testThread03).start();
for (int i = 0; i < 999; i++) {
System.out.println("hello~" + i);
}
}
}
模拟龟兔赛跑
//模拟龟兔赛跑
public class Race implements Runnable {
//胜利者
private static String winner;
@Override
public void run() {
for (int i = 0; i < 101; i++) {
//模拟兔子休息
if(Thread.currentThread().getName().equals("兔") && i%10 == 0){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//判断比赛是否结束
boolean flag = gameOver(i);
//比赛结束则停止
if(flag){
break;
}
System.out.println(Thread.currentThread().getName() + "-->跑了" + i + "步");
}
}
private boolean gameOver(int steps) {
//判断是否有胜利者
if (winner != null) {
return true;
}
{
if (steps == 100) { //胜利者条件
winner = Thread.currentThread().getName();
System.out.println("winner is:" + winner);
return true;
}
}
return false;
}
public static void main(String[] args) {
Race race = new Race();
new Thread(race,"兔").start();
new Thread(race,"龟").start();
}
}
小结
1.实现接口Runnable具有多线程能力
2.启动线程:传入目标对象+Thread对象.start()
3.推荐使用:避免单继承局限性,方便同一个对象被多个线程使用
3.实现Callable接口
步骤:实现Callable接口,重写call方法,抛出异常
同时下载图片
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.concurrent.*;
//实现Callable接口,重写call方法,抛出异常
//可以定义返回值 可以抛出异常
public class TestThread05 implements Callable<Boolean> {
private String url; //目标地址
private String name; //文件名
public TestThread05(String url, String name) {
this.url = url;
this.name = name;
}
//执行体
@Override
public Boolean call() throws Exception {
WebDownloader webDownloader1 = new WebDownloader();
webDownloader1.downloader(url, name);
System.out.println("下载:" + name);
return true;
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
TestThread05 t1 = new TestThread05(
"https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png", "1.png");
TestThread05 t2 = new TestThread05(
"https://www.baidu.com/img/flexible/logo/pc/result.png", "2.png");
TestThread05 t3 = new TestThread05(
"https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png", "3.png");
//创建执行服务
ExecutorService ser = Executors.newFixedThreadPool(3);
//提交执行
Future<Boolean> result1 = ser.submit(t1);
Future<Boolean> result2 = ser.submit(t2);
Future<Boolean> result3 = ser.submit(t3);
//获取结果
boolean rs1 = result1.get();
boolean rs2 = result2.get();
boolean rs3 = result3.get();
//关闭服务
ser.shutdown();
}
}
//下载器
class WebDownloader1{
//下载方法
public void downloader(String url, String name ){
try {
FileUtils.copyURLToFile(new URL(url), new File(name)); //需导入包commons-io
//地址:https://commons.apache.org/proper/commons-io/download_io.cgi
} catch (IOException e) {
e.printStackTrace();
System.out.println("下载方法出现问题");
}
}
}