使用线程
三种使用线程的方法:
1. 实现Runnable接口
2. 实现Callable接口
3. 继承Thread类
实现Runnable和Callable接口的类只能当做一个可以在线程中运行的任务,不是真正意义上的线程,因此最后还是要通过调用Thread来调用,可以说任务是通过线程驱动从而执行的。
1.实现Runnable接口
需要实现run()方法。
通过Thread调用start()方法来启动线程。
public class MyRunnable implements Runnable{
public void run(){
//...
}
public static void main(String[]args){
MyRunnable instance=new MyRunnable();
Thread thread=new Thread(instance);
thread.start();
}
}
2.实现Callable接口
与Runnable相比,Callable有返回值,返回值通过Futrue Task进行封装。
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
import java.java.util.concurrent.Thread;
public class CallableTest{
public static void main(String[]args) throws ExecutionException,InterruptedException{
MyCallable mc =new MyCallable();
FutureTask<Integer>ft=new FutureTask<Integer>(mc);
Thread thread=new Thread(ft);
thread.start();
System.out.print(ft.get());
}
}
class MyCallable implements Callable {
public Integer call(){
return 123;
}
}
3.继承Thread类
需要实现run()方法,因为Thread也实现了Runnable接口。
当调用start()方法启动一个线程时,虚拟机会将该线程放到就绪队列中等待被调度,当一个线程被调度的时候会执行该线程的run()方法。
public class MyThread extends Thread{
public void run(){
//...
}
}
public static void main(String[]args){
MyThread myThread=new MyThread();
myThread.start();
}
实现接口VS继承Thread
实现接口更好一点:
1.java 不支持多重继承,因此继承了Thread就无法继承其他类,但是可以实现多个接口;
2.类可能只要求执行就好,如果继承的话开销太大。