多线程笔记
实现多线程的第二种方法:
实现Runnable接口,重写run()方法
package com.qinayu;
public class TestRunnable implements Runnable{
@Override
public void run() {
for (int i = 0; i < 200; i++) {
System.out.println("这是run多线程");
}
}
public static void main(String[] args) {
TestRunnable t1 = new TestRunnable(); //创建Runnable接口实现类的实例对象
new Thread(t1).start(); //将此实例对象作为Thread的参数传进去
for (int i = 0; i < 200; i++) {
System.out.println("这是main线程");
}
}
}
运行结果:
案例:模拟龟兔赛跑
package com.qinayu.test;
public class Race implements Runnable {
private static String winner;
@Override
public void run() {
for (int i = 0; i <= 100; i++) { //假设起点到终点是100米的距离
boolean flag = gameOver(i);
if(flag){
break;
}
System.out.println(Thread.currentThread().getName()+"距离终点还有"+(100-i)+"米");
}
}
public boolean gameOver(Integer s){ //s为跑了多少米
if(winner != null){ //说明已经有胜利者了
return true;
}else{
//程序执行到这里,说明没有胜利者,那么就要判断找出胜利者
if(s >= 100){
//如果已经跑了大于等于100米,说明胜利了
winner = Thread.currentThread().getName();
System.out.println("胜利者是:"+winner);
return true;
}
}
return false;
}
public static void main(String[] args) {
Race race = new Race();
new Thread(race,"兔子").start();
new Thread(race,"乌龟").start();
}
}
龟兔不睡觉,正常运行结果:
但若一定想让乌龟赢的比赛,那就手动添加睡眠程序,改造run()方法:
@Override
public void run() {
if(Thread.currentThread().getName().equals("兔子")){ //如果当前线程名称是兔子,那么我们让它休眠100ms
try {
Thread.sleep(6);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int i = 0; i <= 100; i++) { //假设起点到终点是100米的距离
boolean flag = gameOver(i);
if(flag){
break;
}
System.out.println(Thread.currentThread().getName()+"距离终点还有"+(100-i)+"米");
}
}
兔子睡觉,程序运行结果:



