线程的几种创建方法

Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。Java可以用三种方式来创建线程,如下所示:

1)继承Thread类创建线程

public class MyThread extends Thread{//继承Thread类

  public void run(){

  //重写run方法

  }

}

public class Main {

  public static void main(String[] args){

    new MyThread().start();//创建并启动线程

  }

}

2)实现Runnable接口创建线程

                new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println(" this is a thread");
			}
		}).start();
 //lambed表达式
		new Thread(() -> System.out.println(" this is a thread")).start();

3.通过Callable和Future创建线程

Thread类的target。在Future接口里定义了几个公共方法来控制它关联的Callable任务。

>boolean cancel(boolean mayInterruptIfRunning):视图取消该Future里面关联的Callable任务
>V get():返回Callable里call()方法的返回值,调用这个方法会导致程序阻塞,必须等到子线程结束后才会得到返回值
>V get(long timeout,TimeUnit unit):返回Callable里call()方法的返回值,最多阻塞timeout时间,经过指定时间没有返回抛出TimeoutException
>boolean isDone():若Callable任务完成,返回True
>boolean isCancelled():如果在Callable任务正常完成前被取消,返回True

public class Dame2 implements Callable<Integer> {

	@Override
	public Integer call() throws Exception {
		int count = 2;
		return count * 10;
	}

	public static void main(String[] args) throws InterruptedException, ExecutionException {
		Dame2 test = new Dame2();
		FutureTask<Integer> thread = new FutureTask<>(test);
		new Thread(thread, "有返回值的线程").start();
		System.out.println(thread.get());
	}

}

//用lambda的写法:

public class Dame2 {

	public static void main(String[] args) throws InterruptedException, ExecutionException {
		FutureTask<Integer> thread = new FutureTask<>( ()->{ 
			int count = 2;
		        return count * 10;
	      });
            new Thread(thread, "有返回值的线程").start();
            System.out.println(thread.get());
	}
}

三种创建线程方法对比

实现Runnable和实现Callable接口的方式基本相同,不过是后者执行call()方法有返回值,后者线程执行体run()方法无返回值,因此可以把这两种方式归为一种,这种方式与继承Thread类的方法之间的差别如下:


1、线程只是实现Runnable或实现Callable接口,还可以继承其他类。

2、这种方式下,多个线程可以共享一个target对象,非常适合多线程处理同一份资源的情形。

3、但是编程稍微复杂,如果需要访问当前线程,必须调用Thread.currentThread()方法。

4、继承Thread类的线程类不能再继承其他父类(Java单继承决定)。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章