Java中创建线程有三种,分别为实现Runnable接口,继承Thread类,实现Callable接口。

1.Thread

public class MyThread extends Thread {

	public MyThread() {
		this.setName("MyThread");
	}

	public void run() {

		while(true){
			System.out.println("当前运行的线程: "+this.getName());

			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {

				e.printStackTrace();
			}
		}
	}

	public static void main(String []args){

		new MyThread().start();

	}
}
  • 优点:在run方法内直接用this获取当前线程,无需使用Thread.currentThread()
  • 缺点:Java不支持多继承,如果继承Thread类,就不能继承其它类。任务与线程没有分离,对于多个线程执行一样的任务时需要多份任务代码,而Runnable没有这个限制。

2.Runnable接口

public class RunnableTask implements Runnable {

	@Override
	public void run() {
		// TODO Auto-generated method stub
		while (true) {
			System.out.println("当前运行的线程: " + Thread.currentThread().getName());

			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	public static void main(String[] args) throws InterruptedException {

		RunnableTask task = new RunnableTask();
		new Thread(task).start();
		new Thread(task).start();


	}

}

以上两种方式没有返回值。

3.Callable接口


public class CallableTest {
	public static void main(String []args) throws Exception {

		Callable<Integer> call  = new Callable<Integer>() {

			@Override
			public Integer call() throws Exception {
				System.out.println("thread start..");
				Thread.sleep(2000);
				return 1;
			}
		};

		FutureTask<Integer> task = new FutureTask<>(call);
		Thread t = new Thread(task);

		t.start();
		System.out.println("do other thing..");
		System.out.println("拿到线程的执行结果 : " + task.get());
	}
}

控制台输出:

do other thing..
thread start..
拿到线程的执行结果 : 1

Callable和Runnable的区别:

  • Callable定义的方法是call,而Runnable定义的方法是run。
  • Callable的call方法可以有返回值,而Runnable的run方法不能有返回值。
  • Callable的call方法可抛出异常,而Runnable的run方法不能抛出异常。 
    07-28 02:26