参考链接
启动线程
的唯一方法就是通过 Thread类的start()实例方法
- 线程开启不一定执行,由CPU调度执行
start()方法是一个 native方法,它将启动一个新线程,并 执行run()方法
第一二种方式:无返回值
通过重写run方法,run方式的返回值是void,所以没有办法返回结果
继承Thread类
- 通过自己的类直接 extends Thread
- 重写run()方法,就可以启动新线程并执行自己定义的run()方法
- start() 启动线程
public class MyThread extends Thread {
@Override
public void run() {
System.out.println("start");
}
}
public static void main(String[] args) {
MyThread myThread1 = new MyThread();
myThread1.start();
}
实现Runnable接口
- 实现Runnable接口,并 重写run() 方法
- 实现Runnable接口的 实现类的实例对象 作为 Thread构造函数的target
public class MyThread implements Runnable {
@Override
public void run() {
System.out.println("start");
}
}
public static void main(String[] args) {
MyThread myThread2 = new MyThread();
Thread thread = new Thread(myThread2);
thread.start();
}
ExecutorService、Callable都是属于Executor框架;有返回值
实现Callable接口
- 实现Callable接口 ,并 重写Call() 方法
- 实现Callable接口的 实现类的实例对象,使用 FutureTask类包装Callable对象,该FutureTask对象封装了Callable对象的Call方法的返回值
- 使用 FutureTask对象作为Thread对象的target 创建并启动线程
- 调用 FutureTask对象的get() 来获取子线程执行结束的返回值
public class MyThread implements Callable<String>{
@Override
public String call() throws Exception {
// TODO Auto-generated method stub
return null;
}
}
public static void main(String[] args) throws Exception {
MyThread myThread3 = new MyThread();
FutureTask<String> future = new FutureTask<>(myThread3);
Thread t = new Thread(future);
t.start();
...
String result = future.get(); //同步获取返回结果
System.out.println(result);
}
线程池
public class MyThread implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("start");
}
public static void main(String[] args) {
MyThread task = new MyThread();
ExecutorService ex = Executors.newCachedThreadPool();
ex.execute(task);
...
}
}