java虚拟机允许应用程序并发地运行多个线程。
一、继承Thread类,重写run方法
Thread本质上也是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方式就是通过Thread类的start()方法
public class Demo extends Thread
{
Demo(String name)
{
super(name);
}
public void run()
{
System.out.println(Thread.currentThread().getName());
}
public static void main(String []args) {
Demo d1=new Demo("DemoThread1");
Demo d2=new Demo("DemoThread2");
/*start()方法并不是立即执行多线程代码,而是使得该线程变为可运行态(Runnable)
* 什么时候运行多线程由操作系统决定
*/
d1.start();
d2.start();
}
}
二、实现Runnable接口,并实现该接口的run()方法
实现同步--锁下面的例子:https://blog.csdn.net/jiangshangchunjiezi/article/details/88118063
三、实现Callable接口,重写call()方法
接口Callable<V>
方法:V call() throws Exception
--------------
接口Runnable
方法: void run()
Callable 接口与Runnable接口的功能类似,但提供了比Runnable更强大的功能,主要表现为:
①Callable可以在任务结束后提供一个返回值,Runnable方法无法提供此功能
②Callable中的call()方法可以抛出异常,而Runnable的run()方法不能抛出异常
③运行Callable可以拿到一个Future对象
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class Demo implements Callable<String>
{
public String call() throws Exception {
// TODO Auto-generated method stub
return "hello world";
}
public static void main(String []args) {
ExecutorService threadPool=Executors.newSingleThreadExecutor();
//启动线程
Future<String> future=threadPool.submit(new Demo());
try {
System.out.println("waiting thread to finish");
System.out.println(future.get());//获取线程执行的返回值
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
四、如何选择
一般推荐实现Runnable接口的方式,其原因是:
- java不支持多继承,因此选用实现Runnable接口的类还可以再继承其他类
- Thread类里面有很多已经实现的方法,如果这些方法用的少或者不需要重写,两种方法实现的效果是一样的。
五、一个类可以同时继承Thread和实现Runnable
Demo类从Thread类中继承了run()方法,这个继承的run()可以被当做对Runnable接口的实现,因为这段代码可以编译通过
public class Demo extends Thread implements Runnable
{
public static void main(String []args) {
Thread t=new Thread(new Demo());
t.run();
}
}
当然也可以不使用继承的run()方法,而是需要通过在Demo类中重写run()方法来实现Runnable接口中的run()方法。
public class Demo extends Thread implements Runnable
{
public void run()
{
System.out.println(Thread.currentThread().getName());
}
public static void main(String []args) {
Thread t=new Thread(new Demo());
t.run();
}
}