线程创建
继承Thread类(重点)
- 自定义线程类继承Thread类
- 重写run()方法,编写线程执行体
- 创建线程对象,调用start()方法启动线程
调用run()方法先执行方法体内的代码
调用start()是同时执行
演示:
public class TestThread extends Thread{
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("你好" + i);
}
}
public static void main(String[] args) {
TestThread testThread = new TestThread();
testThread.run();//调用run()方法
for (int i = 0; i < 5; i++) {
System.out.println("世界" + i);
}
}
}
结果:
public class TestThread extends Thread{
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("你好" + i);
}
}
public static void main(String[] args) {
TestThread testThread = new TestThread();
testThread.start();
for (int i = 0; i < 5; i++) {
System.out.println("世界" + i);
}
}
}
结果:
**注意:**线程开启不一定立即执行,由CPU调度
实现Runnable接口(重点)
- 定义MyRunnable类实现Runnable接口
- 实现run()方法,编写线程执行体
- 创建线程对象,调用start()方法启动线程
代码演示;
public class TestRunnable implements Runnable{
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("你好" + i);
}
}
public static void main(String[] args) {
TestRunnable testRunnable = new TestRunnable();
new Thread(testRunnable).start();
for (int i = 0; i < 5; i++) {
System.out.println("世界" + i);
}
}
}
结果:
两个方法对比:
- 继承Thread类
子类继承Thread类具备多线程能力
启动线程:子类对象. start()
不建议使用:避免0OP单继承局限性 - 实现Runnable接口
实现接口Runnable具有多线程能力
启动线程:传入目标对象+ Thread对象.start()
推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用
实现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();