多线程
多线程的三种创建方式:
Thread class:继承Thread类
Runnable接口:实现Runnable接口
Callable接口:实现Callable接口
继承Thread类
public class TestThread extends Thread{
public void run(){
//run方法线程体
for (int i = 0; i < 20; i++)
System.out.println("我在看代码---" + i);
}
public static void main(String[] args) {
//main线程,主线程
//创建线程对象
TestThread t1 = new TestThread();
//调用start方法开启线程
t1.start();
for (int i = 0; i < 20; i++)
System.out.println("我在学习多线程---" + i);
}
}
实现Runnable接口
public class TestThread implements Runnable{
public void run(){
//run方法线程体
for (int i = 0; i < 2000; i++)
System.out.println("我在看代码---" + i);
}
public static void main(String[] args) {
//main线程,主线程
//创建Runnable接口的实现类对象
TestThread t2 = new TestThread();
new Thread(t2).start();
for (int i = 0; i < 2000; i++)
System.out.println("我在学习多线程---" + i);
}
}
运行结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4KDqXpK9-1616209566051)(C:\Users\24050\Desktop\1.png)]
可以看出,有多条执行路径,主线程和子线程并行交替执行。
小结
继承Thread类:
子类继承Thread类具有多线程能力
启动线程:子类对象.start()
不建议使用:避免OOP单继承局限性
实现Runnable接口:
实现Runnable接口具有多线程能力
启动线程:传入目标对象+Thread对象.start()
推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用
龟兔赛跑小案例
public class Race implements Runnable{
//胜利者
private static String winner;
public void run(){
for(int i = 0; i <= 100; i++){
//模拟兔子休息
if (Thread.currentThread().getName().equals("兔子") && i % 10 == 0){
try {
Thread.sleep(5);
} 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();
}
}