Java创建线程的几种常用方式

在Java中提到创建线程就要想到java.lang包下的Thead类。

认识Thread类的几个构造器
  • 1)Thread():创建新的Thread对象
  • 2)Thread(String threadName):创建线程并制定线程名
  • 3)Thread(Runnable target):指定创建线程的目标对象,它实现了Runnable接口中的run方法
  • 4)Thread(Runnable target, String name):创建新的Thread对象
创建线程的方法
1. 继承Thread类

1)定义子类继承Thread类。
2)子类中重写Thread类中的run方法。
3)创建Thread子类对象,即创建了线程对象。
4)调用线程对象start方法:启动线程,调用run方法。

2. 实现Runnable接口

1)定义子类实现Runnable接口。
2)子类中重写Runnable接口中的run方法。
3)通过Thread类含参构造器创建线程对象。
4)将Runnable接口的子类对象作为实际参数传递给Thread类的构造器中。
5)调用Thread类的start方法:开启线程,调用Runnable子类接口的run方法。

1、2代码:
class MyThread01 extends Thread{
	@Override
	public void run() {
		System.out.println("-------------MyThread01");
	}
}

class MyThread02 implements Runnable {
	@Override
	public void run() {
		System.out.println("-------------MyThread02");
	}
}


public class ThreadDemo01 {
	
	public static void main(String[] args) {
		MyThread01 t1 = new MyThread01();
		t1.setName("t1");
		t1.start();
		
		Thread t2 = new Thread(new MyThread02(), "t2");
		t2.start();
	}
}

3. 实现Callable接口

与使用Runnable相比,Callable功能更强大些:

  • 1)相比run()方法,可以有返回值
  • 2)方法可以抛出异常
  • 3)支持泛型返回值
  • 4)需借助FutureTask类,比如获取返回结果

Future接口:

  • 1)可对具体Runnable、Callable任务的执行结果进行取消、查询是否完成、获取结果等。
  • 2)FutureTask是Future接口的唯一实现类。
  • 3)FutureTask同时实现了Runnable,Future接口。它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值。
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

class MyThread03 implements Callable<Integer> {

	@Override
	public Integer call() throws Exception {
		System.out.println("-----------MyThread03");
		return 200;
	}
	
}

public class ThreadDemo02 {
	public static void main(String[] args) throws InterruptedException, ExecutionException {
		FutureTask<Integer> futureTask = new FutureTask<Integer>(new MyThread03());
		// 创建线程
		Thread t3 = new Thread(futureTask);
		// 启动线程
		t3.start();
		
		Integer value = futureTask.get();
		System.out.println(value);
	}
}
注意点:
  • 1)如果自己手动调用run()方法,那么就只是普通的方法,没有启动多线程模式。
  • 2)run()方法由JVM调用,什么时候调用,执行的过程控制都有操作系统的CPU调度决定。
  • 3)想要启动多线程,必须调用start方法。
  • 4)一个线程对象只能调用一次start方法,如果重复调用了,则将抛出以异常“IllegalThradStateException”。
继承方式和接口方式的区别
  • 1)继承Thread:线程代码存放在子类run方法中。
  • 2)实现Runnable:线程代码存在接口的子类的run方法中。

使用实现方式的好处:

  • 1)避免了单继承的局限性。
  • 2)多个线程可以共享同一个接口实现类的对象,非常适合多个相同线程来处理同一份资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值