java创建线程的三种方式及其对比

2014年11月14日 22:14:15

Java中创建线程主要有三种方式:

一、继承Thread类创建线程类

(1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。

(2)创建Thread子类的实例,即创建了线程对象。

(3)调用线程对象的start()方法来启动该线程。

package com.thread;

public class FirstThreadTest extends Thread{
	int i = 0;
	//重写run方法,run方法的方法体就是现场执行体
	public void run()
	{
		for(;i<100;i++){
		System.out.println(getName()+"  "+i);
		
		}
	}
	public static void main(String[] args)
	{
		for(int i = 0;i< 100;i++)
		{
			System.out.println(Thread.currentThread().getName()+"  : "+i);
			if(i==20)
			{
				new FirstThreadTest().start();
				new FirstThreadTest().start();
			}
		}
	}

}

上述代码中Thread.currentThread()方法返回当前正在执行的线程对象。GetName()方法返回调用该方法的线程的名字。

二、通过Runnable接口创建线程类

(1)定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。

(2)创建 Runnable实现类的实例,并依此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。

(3)调用线程对象的start()方法来启动该线程。

示例代码为:

package com.thread;

public class RunnableThreadTest implements Runnable
{

	private int i;
	public void run()
	{
		for(i = 0;i <100;i++)
		{
			System.out.println(Thread.currentThread().getName()+" "+i);
		}
	}
	public static void main(String[] args)
	{
		for(int i = 0;i < 100;i++)
		{
			System.out.println(Thread.currentThread().getName()+" "+i);
			if(i==20)
			{
				RunnableThreadTest rtt = new RunnableThreadTest();
				new Thread(rtt,"新线程1").start();
				new Thread(rtt,"新线程2").start();
			}
		}

	}

}

三、通过Callable和Future创建线程

(1)创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值。

(2)创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。

(3)使用FutureTask对象作为Thread对象的target创建并启动新线程。

(4)调用FutureTask对象的get()方法来获得子线程执行结束后的返回值

实例代码:

package com.thread;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class CallableThreadTest implements Callable<Integer>
{

	public static void main(String[] args)
	{
		CallableThreadTest ctt = new CallableThreadTest();
		FutureTask<Integer> ft = new FutureTask<>(ctt);
		for(int i = 0;i < 100;i++)
		{
			System.out.println(Thread.currentThread().getName()+" 的循环变量i的值"+i);
			if(i==20)
			{
				new Thread(ft,"有返回值的线程").start();
			}
		}
		try
		{
			System.out.println("子线程的返回值:"+ft.get());
		} catch (InterruptedException e)
		{
			e.printStackTrace();
		} catch (ExecutionException e)
		{
			e.printStackTrace();
		}

	}

	@Override
	public Integer call() throws Exception
	{
		int i = 0;
		for(;i<100;i++)
		{
			System.out.println(Thread.currentThread().getName()+" "+i);
		}
		return i;
	}

}

二、创建线程的三种方式的对比

采用实现Runnable、Callable接口的方式创见多线程时,优势是:

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

在这种方式下,多个线程可以共享同一个target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。

劣势是:

编程稍微复杂,如果要访问当前线程,则必须使用Thread.currentThread()方法。

使用继承Thread类的方式创建多线程时优势是:

编写简单,如果需要访问当前线程,则无需使用Thread.currentThread()方法,直接使用this即可获得当前线程。

劣势是:

线程类已经继承了Thread类,所以不能再继承其他父类。


Java创建线程的三种方式及其对比

Java中创建线程主要有三种方式: 一、继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()...
  • shenggaofei
  • shenggaofei
  • 2016-09-23 20:54:48
  • 5204

创建线程的三种方法

第一种方法:继承Thread类,重写run()方法,run()方法代表线程要执行的任务。 第二种方法:实现Runnable接口,重写run()方法,run()方法代表线程要执行的任务。 第三种方法:实...
  • baidu_21578557
  • baidu_21578557
  • 2016-04-16 21:34:01
  • 8628

创建线程的几种方式

Thread Runnable ExecutorService/Callable/Future
  • cyantide
  • cyantide
  • 2016-03-13 12:12:46
  • 2251

创建线程的三种方式优缺点

Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。 一、继承Thread类创建线程类 1.重写run方法。该run()方法的方法体就代表了线程需要完成的任务 ...
  • sinat_27933301
  • sinat_27933301
  • 2017-04-10 11:08:21
  • 5255

创建线程的几种方法及比较

1、通过继承Thread类创建线程 (1).首先定义一个类去继承Thread父类,重写父类中的run()方法。在run()方法中加入具体的任务代码或处理逻辑。 (2).直接创建一个ThreadTes...
  • u012470138
  • u012470138
  • 2016-11-21 10:17:24
  • 3165

创建线程的三种方式和区别

第一种创建方式: 继承Thread,并且重写run方法。package com.easytopit.thread; public class ExtendsThread extends Thread...
  • HelianthS
  • HelianthS
  • 2016-07-09 15:37:24
  • 583

java线程(1)——三种创建线程的方式

1、接口实现更灵活,java不支持多继承。在这方面,Runnable和Callable更有优势。 2、返回值问题。Runnable和Thread都不能有返回值,但Callable可以,而...
  • u010066934
  • u010066934
  • 2016-04-04 21:16:24
  • 1973

HashTable和HashMap的区别详解

一、HashMap简介       HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。       Has...
  • fujiakai
  • fujiakai
  • 2016-06-04 19:35:53
  • 67218

创建线程的三种方式

一、继承Thread类+重写run()方法 启动:创建子类对象+对象.start() 二、实现Runnable接口+重写run方法 启动:使用静态代理 1)、创建真实角色 2)、创建代理角色...
  • scgaliguodong123_
  • scgaliguodong123_
  • 2015-05-27 17:13:11
  • 6928

Java创建线程的三种方式

Java有三种创建线程的方式,分别是继承Thread类、实现Runable接口和使用线程池 1、继承Thread类 使用该方式创建及使用线程需按以下三个步骤: (1)定义Thread类的子类,并...
  • sinat_28028941
  • sinat_28028941
  • 2017-03-07 21:14:35
  • 1844
收藏助手
不良信息举报
您举报文章:java创建线程的三种方式及其对比
举报原因:
原因补充:

(最多只允许输入30个字)