线程实现方法
1、继承Thread类
// 让子类继承Thread线程类
public class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("MyThread: " + i);
}
}
}
2、实现Runnable接口
public class MyRunnable implements Runnable{
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("子线程输出" + i);
}
}
}
3、实现Callable接口
- 假设线程执行完毕后有一些数据要返回,他们重写的run方法均不能直接返回结果。
- JDK5.0提供了Callable接口和FutureTask类来实现(多线程的第三种创建方法)
- 实现方法:
public class MyCallable implements Callable<String> {
private int n;
public MyCallable(int n) {
this.n = n;
}
// 重写call方法
@Override
public String call() throws Exception {
// 描述线程的任务,返回线程执行返回后的结果。
// 需求:求1-n的和返回。
int sum = 0;
for (int i = 0; i <= n; i++) {
sum += i;
}
return "线程求出了1-" + n + "的和是:" + sum;
}
}
Callable<String> call = new MyCallable(100);
// 把Callable对象封装成FutureTask对象(任务对象)
// 1、是一个任务对象,实现了Runnable对象
// 2、可以在线程执行完毕后,用未来任务对象调用get方法获取线程执行完毕后的结果。
FutureTask<String> f1 = new FutureTask<>(call);
new Thread(f1).start();
// 获取执行完毕后哦返回的结果
/*
如果执行到这里,线程还没有执行完毕,
这里的代码会暂停,等待上面线程执行完毕后才回获取结果
*/
String s = f1.get();
System.out.println(s);
- 常用API
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 5; i++) {
System.out.println(i);
// 休眠5秒
if (i == 3) {
Thread.sleep(5000);
}
}
// join方法作用:让当前调用这个方法的线程先执行完。
Thread t1 = new MyThread("1号线程");
t1.start();
t1.join();
Thread t2 = new MyThread("2号线程");
t2.start();
t2.join();
Thread t3 = new MyThread("3号线程");
t3.start();
t3.join();
}