在Java中提到创建线程就要想到java.lang包下的Thead类。
认识Thread类的几个构造器
- 1)Thread():创建新的Thread对象
- 2)Thread(String threadName):创建线程并制定线程名
- 3)Thread(Runnable target):指定创建线程的目标对象,它实现了Runnable接口中的run方法
- 4)Thread(Runnable target, String name):创建新的Thread对象
创建线程的方法
1. 继承Thread类
1)定义子类继承Thread类。
2)子类中重写Thread类中的run方法。
3)创建Thread子类对象,即创建了线程对象。
4)调用线程对象start方法:启动线程,调用run方法。
2. 实现Runnable接口
1)定义子类实现Runnable接口。
2)子类中重写Runnable接口中的run方法。
3)通过Thread类含参构造器创建线程对象。
4)将Runnable接口的子类对象作为实际参数传递给Thread类的构造器中。
5)调用Thread类的start方法:开启线程,调用Runnable子类接口的run方法。
1、2代码:
class MyThread01 extends Thread{
@Override
public void run() {
System.out.println("-------------MyThread01");
}
}
class MyThread02 implements Runnable {
@Override
public void run() {
System.out.println("-------------MyThread02");
}
}
public class ThreadDemo01 {
public static void main(String[] args) {
MyThread01 t1 = new MyThread01();
t1.setName("t1");
t1.start();
Thread t2 = new Thread(new MyThread02(), "t2");
t2.start();
}
}
3. 实现Callable接口
与使用Runnable相比,Callable功能更强大些:
- 1)相比run()方法,可以有返回值
- 2)方法可以抛出异常
- 3)支持泛型返回值
- 4)需借助FutureTask类,比如获取返回结果
Future接口:
- 1)可对具体Runnable、Callable任务的执行结果进行取消、查询是否完成、获取结果等。
- 2)FutureTask是Future接口的唯一实现类。
- 3)FutureTask同时实现了Runnable,Future接口。它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值。
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
class MyThread03 implements Callable<Integer> {
@Override
public Integer call() throws Exception {
System.out.println("-----------MyThread03");
return 200;
}
}
public class ThreadDemo02 {
public static void main(String[] args) throws InterruptedException, ExecutionException {
FutureTask<Integer> futureTask = new FutureTask<Integer>(new MyThread03());
// 创建线程
Thread t3 = new Thread(futureTask);
// 启动线程
t3.start();
Integer value = futureTask.get();
System.out.println(value);
}
}
注意点:
- 1)如果自己手动调用run()方法,那么就只是普通的方法,没有启动多线程模式。
- 2)run()方法由JVM调用,什么时候调用,执行的过程控制都有操作系统的CPU调度决定。
- 3)想要启动多线程,必须调用start方法。
- 4)一个线程对象只能调用一次start方法,如果重复调用了,则将抛出以异常“IllegalThradStateException”。
继承方式和接口方式的区别
- 1)继承Thread:线程代码存放在子类run方法中。
- 2)实现Runnable:线程代码存在接口的子类的run方法中。
使用实现方式的好处:
- 1)避免了单继承的局限性。
- 2)多个线程可以共享同一个接口实现类的对象,非常适合多个相同线程来处理同一份资源。