线程创建简介
1.在java中表示线程的是Thread类。无论是那种方式创建线程,本质上都是创建Thread类的对象。
2.Thread类继承Runnable接口,且也有以Runnable作为参数的构造方法。
3.FutureTask这个类也实现了Runnable接口,故也可以作为参数传进Thread 里面来创建线程。
线程的创建
继承Thread类
package thread; /** * 继承thread类来创建线程 * * @author dh * */ public class ExtendsThread extends Thread { public void run() { for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName() + " _"+i); } } }### 实现Runnable接口
package thread; /** * 实现 Runnable接口 * * @author dh * */ public class ImplementRunnable implements Runnable { private int i; public ImplementRunnable(int i) { this.i = i; } @Override public void run() { for (; i < 20; i++) { System.out.println(Thread.currentThread().getName() + " _" + i); } } }### 实现Callable接口
package thread; import java.util.concurrent.Callable; /** * * @author dh * */ public class ImplementCallable implements Callable### 创建线程{ private int i; public ImplementCallable(int i) { this.i = i; } @Override public String call() throws Exception { for (; i < 20; i++) { System.out.println(Thread.currentThread().getName() + " _" + i); } return "1"; } }
package thread; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; /** * * @author dh * */ public class TestD { public static void main(String[] args) throws InterruptedException, ExecutionException { ExtendsThread et = new ExtendsThread(); et.run(); ImplementRunnable imr = new ImplementRunnable(0); Thread thread = new Thread(imr); thread.start(); Thread thread1 = new Thread(imr); thread1.start(); ImplementCallable implCallable = new ImplementCallable(1); FutureTaskft = new FutureTask (implCallable); Thread thread2 = new Thread(ft); thread2.start(); System.out.println(ft.get()); } } }
结果如下:
main _0 main _1 main _2 main _3 main _4 main _5 main _6 main _7 main _8 main _9 Thread-1 _0 Thread-2 _0 Thread-1 _1 Thread-2 _2 Thread-1 _3 Thread-2 _4 Thread-1 _5 Thread-2 _6 Thread-1 _7 Thread-2 _8 Thread-1 _9 Thread-2 _10 Thread-1 _11 Thread-2 _12 Thread-1 _13 Thread-2 _14 Thread-1 _15 Thread-2 _16 Thread-1 _17 Thread-2 _18 Thread-1 _19 Thread-3 _1 Thread-3 _2 Thread-3 _3 Thread-3 _4 Thread-3 _5 Thread-3 _6 Thread-3 _7 Thread-3 _8 Thread-3 _9 Thread-3 _10 Thread-3 _11 Thread-3 _12 Thread-3 _13 Thread-3 _14 Thread-3 _15 Thread-3 _16 Thread-3 _17 Thread-3 _18 Thread-3 _19 1
3种方式创建的优缺点
1.继承Thread显然有个很大的缺点,java是单继承了,如果继承了Thread那么就无法继承其他类。但是继承Thread编写简单,实现方便。
2.实现Runnable接口和Callable接口。大致一样,区别就是Callable接口的实现可以有返回值,且可以抛出显示异常。其余大致一样。
他们的优势是实现接口,那么实现类可以有其他父类,避免的Thread的问题,其次可以用一个实现了该接口的对象来创建多个线程,从而方便一些基本的资源共享,因为是同一个对象。