龟兔赛跑
public class RaceOfRT implements Runnable{
private static String winner;
//实现接口必须重写run方法,否则报错
@Override
public void run(){
//赢家判定规则:先达到100米
//整个跑步的过程
for (int i = 0; i <=100 ; i++) {
//兔子睡觉 在50步的时候休息10ms
//字符串的比较需要用equals
if(Thread.currentThread().getName().equals("兔子")&&i==50){
try{
Thread.sleep(10);
}catch(InterruptedException e){
e.printStackTrace();
}
}
//获胜判定
boolean flag = win(i);
if(winner!=null)
{
//退出循环
break;
}
//跑步的过程
System.out.println(Thread.currentThread().getName()+"跑了"+i+"米");
}
}
//判断是否有人获胜
//上面的函数不能内置判断函数,因为单个函数描述的是一个线程,而结果需要在多个线程之间进行比较
//对每个线程内部的i进行大小比较,如果某线程的i达到了100,则判定其胜出
//由于每个线程都要比较,所以当一个达到100的时候,其他的线程应当停止循环
public boolean win(int i ){
if(i==100&&winner==null) {
winner =Thread.currentThread().getName();
System.out.println(Thread.currentThread().getName()+"获胜。");
return true;
}
else return false;
}
public static void main(String[] args) {
//将对象实例化
RaceOfRT r=new RaceOfRT();
//新建线程将会直接执行run函数
new Thread(r,"兔子").start();
new Thread(r,"乌龟").start();
}
}
实现callable接口
- 接口后需要加入返回值类型
- 重写的方法为call,返回值自定义,需要体现在类定义处
- 创建执行服务
- 提交执行
- 获取结果
- 关闭服务
public class callableTest implements Callable<ELemType>{
@Override
public ElemType call()
{
return ElemType x;
}
public static void main(String[] args) {
//创建对象
/*此处每个线程都要创建一个对象,而runnable接口可以实现一个对象对应多个线程*/
callableTest c1 = new callableTest();
callableTest c2 = new callableTest();
callableTest c3 = new callableTest();
//创建执行服务
ExecutorService s = Executors.newFixedThreadPool(3);
//提交执行
Future<ElemType> f1 = s.submit(c1);
Future<ElemType> f2 = s.submit(c2);
Future<ElemType> f3 = s.submit(c3);
//获取结果
ElemType e1 = f1.get();
ElemType e2 = f2.get();
ElemType e3 = f3.get();
//...
//关闭服务
s.shutdownNow();
}
}
好处
- 可以有返回值
- 可以抛出异常(在服务中利用自带的方法)