多线程(一):线程创建的三种方式
1.继承Thread类
- 子类继承Thread类具备多线程能力
- 启动线程:子类对象.start()
不建议使用:避免单继承的局限性
2.实现Runnable接口
- 实现接口Runnable具有多线程能力
- 启动线程:传入目标对象+Thread对象.start()
推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用
模拟归途赛跑的一个例子:
package com.aynu.demo1;
//模拟龟兔赛跑
public class Race implements Runnable{
private static String winner;
@Override
public void run() {
for (int i = 0; i <= 100; i++) {
//模拟兔子睡觉
if(Thread.currentThread().getName().equals("兔子") && i %10==0){
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
boolean flag = isgameover(i);
if (flag){
break;
}else {
System.out.println(Thread.currentThread().getName()+"-->跑了"+i+"步");
}
}
}
//判断比赛是否结束
public boolean isgameover(int steps){
if (winner!=null){
return true;
}else {
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();
}
}
3.实现Callable接口
- 1.实现Callable接口,需要返回值好类型
- 2.重写call方法,需要抛出异常
- 3.创建爱你目标对象
- 4.创建执行服务:ExecutorService ser = Executors.newFixedThreadPool(1);
- 5.提交执行:Future result1 = ser.submit(t1);
- 6.获取结果:boolean r1 = result1.get();
- 7.关闭服务:ser.shutdownNow();
实现callable接口的好处:
1.有返回值;
2.可以抛出异常