一、继承Thread类
(1)创建MyThread1类,让其继承 Thread 类并重写 run() 方法;
(2)创建MyThread1类的对象;
(3)调用线程对象的start()方法启动线程。
示例代码如下:
public class MyThread {
public static void main(String[] args) {
MyThread1 myThread1 = new MyThread1();
myThread1.start();
}
}
class MyThread1 extends Thread {
@Override
public void run() {
for (int i=0;i<5;i++) {
System.out.println("MyThread1输出:" + i);
}
}
}
执行结果如下:
MyThread1输出:0
MyThread1输出:1
MyThread1输出:2
MyThread1输出:3
MyThread1输出:4
二、实现Runnable接口
(1) 创建MyRunnable 类实现 Runnable 接口;
(2)创建 MyRunnable 类的实例对象 myRunnable ;
(3)把MyRunnable任务对象交给Thread处理;
(4)调用线程对象的start()方法启动线程。
示例代码如下:
public class ThreadRunnable {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start();
}
}
class MyRunnable implements Runnable {
@Override
public void run() {
for (int i=0;i<5;i++) {
System.out.println("MyRunnable输出:" + i);
}
}
}
执行结果如下:
MyRunnable输出:0
MyRunnable输出:1
MyRunnable输出:2
MyRunnable输出:3
MyRunnable输出:4
相比继承Thread,实现Runnable接口扩展性更强,因为它还可以继续继承其他类和实现接口
二、实现Callable接口
(1)创建 MyCallable 类实现 Callable 接口;
(2)创建 MyCallable 类的实例对象 myCallable;
(3)把实例对象 myCallable 作为参数来创建 FutureTask 类的实例对象 futureTask;
(4)把实例对象 futureTask 作为参数来创建 Thread 类的实例对象 thread,实例对象 thread 就是一个新线程;
(5)调用Thread的start方法启动线程,执行任务。
示例代码如下:
public class ThreadCallable {
public static void main(String[] args) throws ExecutionException, InterruptedException {
MyCallable myCallable = new MyCallable(5);
FutureTask<Integer> futureTask = new FutureTask(myCallable);
Thread thread = new Thread(futureTask);
thread.start();
System.out.println("MyCallable执行结果为:" + futureTask.get());
}
}
class MyCallable implements Callable<Integer> {
private int a;
public MyCallable(int a) {
this.a = a;
}
@Override
public Integer call() throws Exception {
int sum = 0;
for (int i=0;i<a;i++) {
sum += i;
}
return sum;
}
}
执行结果如下:
MyCallable执行结果为:10
FutureTask 类提供了一个 get() 方法用来获取 call() 方法的返回值,但需要注意的是调用这个方法会导致程序阻塞,必须要等到线程结束后才会得到返回值。