一 .概述
在java之中Thread类描述的就是线程这个概念,创建线程就是创建Thread.为了划分并发任务的概念和并发本身,提供了Runnable接口分离线程逻辑单元.
二 .继承Thread创建线程
@Test public void extendsThread() { new Thread() { @Override public void run() { for(;;) System.out.println("extends Thread ...."); }; }.start(); }
在上面,我们通过继承Thread,创建了一个线程,并使用start()方法运行了该线程.在这里,线程的启动是需要调用start()方法的,其中的原因在后面分析.
三 . 使用Runnable来分离线程逻辑单元
@Test public void implementsRunnable() { new Thread(new Runnable() { @Override public void run() { for(;;) System.out.println("implements Runnable ..."); } }).start(); }
在上面,我们实现了一个Runnable接口作为参数传递给了Thread类,在后面我们会分析一下这种情况.
四 .Thread类
我们看到Thread本身就实现着Runnable接口了.
我们看到Thread的构造函数是可以传递一个Runable接口对象的.
总结 : 线程对象在启动的时候,会刦调用run()方法,首先会判断本身是否有target(传递的Runnable),没有就会执行自己的run()方法.
五 .Callable接口
Callable<String> callable = new Callable<String>() { @Override public String call() throws Exception { return "thread is running"; } }; FutureTask<String> futureTask = new FutureTask<String>(callable); new Thread(futureTask).start(); System.out.println(futureTask.get());
在上面,我们首先创建一个Callable接口对象的实例,然后将一个接口包装称为一个FutureTask对象的实例,我们注入到Thread的实例之中,我们就创建了一个待返回值的线程.