一. 继承Thread类
1.将一个类定义为为Thread的子类
2.重写Thread类的run()方法,编写线程执行操作
3.实例化该类对象,对象调用start()方法启动线程
(线程开启不一定立即执行,由CPU调度执行)
public class ThreadWayLearning extends Thread {
//重写run方法
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("这是自定线程" + i);
}
}
public static void main(String[] args) {
ThreadWayLearning threadWayLearning = new ThreadWayLearning();
threadWayLearning.start();
for (int i = 0; i < 200; i++) {
System.out.println("这是主线程" + i);
}
}
}
二. 实现Runnable接口
1.定义一个类实现Runnable接口
2.重写run()方法,编写线程执行操作
3.实例化该类对象
3.创建Thread对象,将该类对象作为参数放进Thread构造方法,调用start()方法启动线程
public class RunnableWayLearning implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("这是自定线程:" + i);
}
}
public static void main(String[] args) {
//和继承Thread类实现多线程的方法区别在于需要实例化Thread对象来调用start方法
RunnableWayLearning runnableWayLearning = new RunnableWayLearning();
new Thread(runnableWayLearning).start();
for (int i = 0; i < 200; i++) {
System.out.println("这是主线程:" + i);
}
}
}
三. 实现Callable接口
1.实现Callable接口,需要返回值类型
2.重写call方法,需要抛出异常
3.创建目标对象
4.创建执行任务 ExecutorService ser = Executors.newFixedThreadPool(1);
5. 获取结果 boolean r1 = result1.get();
6.关闭服务 ser.shutdownNow();
import java.util.concurrent.Callable;
public class CallableWayLearning implements Callable {
@Override
public Boolean call() throws Exception {
for (int i = 0; i < 200; i++) {
System.out.println("这是自定线程" + i);
}
return true;
}
public static void main(String[] args) {
CallableWayLearning callableWayLearning = new CallableWayLearning();
try {
callableWayLearning.call();
} catch (Exception e) {
e.printStackTrace();
}
for (int i = 0; i < 200; i++) {
System.out.println("这是主线程" + i);
}
}
}