创建线程的三种方式
1、继承Thread类
继承Thread类以后根据需要重写run方法,只有调用start方法才是开启了一个新的线程,调用run方法还是主线程,不会开启新的线程。
public class MyThread extends Thread{
@Override
public void run() {
try {
System.out.println("run threadName="
+ this.currentThread().getName() + " begin");
Thread.sleep(2000);
System.out.println("run threadName="
+ this.currentThread().getName() + " end");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.run();
myThread.start();
MyThread myThread1 = new MyThread();
myThread1.start();
}
}
2、实现Runnable接口
实现Runnable接口以后,要把当前的对象实例当做target传给Thread,其中Runnable相当于机器上面的零件,Thread相当于机器,零件必须安装在机器上面才可以正常工作。
public class MyThread2 implements Runnable{
@Override
public void run() {
System.out.println("Hello World!");
}
public static void main(String[] args) {
MyThread2 thread2 = new MyThread2();
Thread thread = new Thread(thread2);
thread.start();
}
}
3、使用Callable接口
public class MyThread3 {
public static void main(String[] args) {
MyThread3 myThread3 = new MyThread3();
FutureTask<Integer> futureTask = new FutureTask<>(
(Callable<Integer>)()-> {
return 5;
}
);
new Thread(futureTask, "有返回值的线程").start();
try {
System.out.println("子线程的返回值" + futureTask.get());
} catch (ExecutionException | InterruptedException e) {
e.printStackTrace();
}
}
}