1、继承Thread类
//运行发现线程是并发执行的,由cpu调度,并不是说main方法执行完,run才执行
public class Test extends Thread {
public static void main(String[] args) {
//首先,new一个本类对象
Test test=new Test();
test.start();
//可以直接写成下面一句,理解就行,道理是一样的
//new Test().start();
for(int i=0;i<1000;i++) {
System.out.println(i+"main方法正在执行中");
}
}
public void run() {
for(int i=0;i<1000;i++) {
System.out.println(i+"run方法执行中");
}
}
}
2、实现Runnable接口
public class Test implements Runnable {
public static void main(String[] args) {
/*只有这部分换了*/
//首先,New一个本类对象
Test test=new Test();
//然后new一个Thread类,将本类中的类对象作为参数传进去
Thread thread = new Thread(test);
thread.start();
for(int i=0;i<1000;i++) {
System.out.println(i+"main方法正在执行中");
}
}
public void run() {
for(int i=0;i<1000;i++) {
System.out.println(i+"run方法执行中");
}
}
}
模拟龟兔赛跑,就想让乌龟赢
public class Test implements Runnable {
private static String winner=null;
public static void main(String[] args) {
Test test=new Test();
new Thread(test,"兔子").start();
new Thread(test,"乌龟").start();
}
//开始跑
public void run() {
for(int i=0;i<=100;i++) {
//判断比赛是否结束
boolean flag=gameover(i);
if("兔子".equals(Thread.currentThread().getName()) && i%10==0) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if(winner!=null) {
break;
}
System.out.println(Thread.currentThread().getName()+"跑了第"+i+"步");
}
}
//判断是否完成比赛
public boolean gameover(int steps) {
//如果胜利者已经存在,直接返回游戏结束
if(winner!=null) {
return true;
}
else {
if(steps>=100) {
winner=Thread.currentThread().getName();
System.out.println("胜利者是"+winner);
return true;
}
}
return false;
}
}
3、实现Callable接口
1)实现Callable接口,需要返回值类型
2)重写的是call方法,需要抛出异常
3)创建目标对象
4)创建执行服务:ExecutorService ser=Executors.newFixedThreadPool(1);
5)提交执行:Future<Boolean> result1=ser.submit(t1);
6)获取结果:boolean r1=result1.get()
7)关闭服务:ser.shutdownNow();
public class Test implements Callable {
public static void main(String[] args) throws InterruptedException, ExecutionException {
Test t1=new Test();
Test t2=new Test();
Test t3=new Test();
//创建执行服务
ExecutorService ser=Executors.newFixedThreadPool(3);
//提交执行
Future<Object> r1=ser.submit(t1);
Future<Object> r2=ser.submit(t2);
Future<Object> r3=ser.submit(t3);
//获取结果
Object result1=r1.get();
Object result2=r1.get();
Object result3=r1.get();
//关闭服务
ser.shutdown();
}
//重写的是call方法,必须要有返回值
public Object call() throws Exception {
for(int i=0;i<3;i++) {
System.out.println("执行了"+Thread.currentThread().getName());
}
return null;
}
}