标签:子类 box div 情况 extends 代码 blog class har
Thread:java使用Thread代表线程,所有的线程对象都必须是Thread类或其子类,可以通过继承Thread类来创建并启动多线程。
package org.github.lujiango; public class Test10 { static class MyThread extends Thread { @Override public void run() { System.out.println("I am extend Thread..."); } } public static void main(String[] args) { MyThread mt = new MyThread(); mt.start(); } }
Runnbale:可以通过实现Runnable接口来创建多线程,创建Runnable实现类的实例,并以此作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。
package org.github.lujiango; public class Test11 { static class MyRunnable implements Runnable { @Override public void run() { System.out.println("I am implement Runnable..."); } } public static void main(String[] args) { Thread t = new Thread(new MyRunnable()); t.start(); } }
Callable:从Java 5开始,Java提供了Callable接口,提供了一个call方法可以作为线程执行体,但是call方法可以有返回值,可以声明抛出异常。Java5提供了Future接口来代表call方法的返回值,并为Future提供了一个FutureTask实现类,该实现类实现了Future和Runnable。
package org.github.lujiango; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; public class Test12 { static class MyCallable implements Callable<String> { @Override public String call() throws Exception { return "my callable"; } } public static void main(String[] args) throws InterruptedException, ExecutionException { MyCallable callable = new MyCallable(); FutureTask<String> future = new FutureTask<String>(callable); new Thread(future).start(); System.out.println(future.get()); } }
创建线程的三种方式比较:
通过继承Thread类或实现Runnable,Callable接口都可以实现多线程。
采用Runnable,Callable接口的方式创建多线程
(1)线程类只是实现了Runnable接口或Callable接口,还可以继承其它类。
(2)多线程可以共享一个target对象,所以合适多个相同线程来处理同一份资源的情况,从而可以将CPU,代码和数据分开,形成清晰的模型,较好的体现了面向对象的思想。
(3)编程稍微复杂,如果需要访问当前线程,则必须使用Thread.currentThread()方法
采用继承Thread类的方法创建多线程
(1)因为多线程类已经继承了Thread类,所以不能在继承其它父类。
(2)编写简单,如果需要访问当前线程,则无须使用Thread.currentThread()方法,直接使用this即可获得当前线程。
多线程-Thread、Runnable、Callbale、Future
标签:子类 box div 情况 extends 代码 blog class har
原文地址:http://www.cnblogs.com/lujiango/p/7581003.html