多线程_02_实现线程的方式

创建线程有三种方式:Thread,Runnable,Callable

1java.lang.Thread

Thread thread=new Thread(){
	@Override
	public void run(){
		while (true) {
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				
				e.printStackTrace();
			}
			System.out.println("1"+Thread.currentThread().getName());
			System.out.println("2:"+this.getName());
		}
	}
	};
	thread.start();


2Runnable接口

Thread thread2=new Thread(new Runnable() {
	@Override
	public void run() {
		while (true) {
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("1"+Thread.currentThread().getName());
		}				
	}
	});
	thread2.start();
runnable对象不是线程,而是线程所要运行代码的宿主。

注意:为什么我们为什么创建一个线程时需要先执行start()在执行run(),而不是直接调用run()方法?

因为run()方法也只是Thread的普通的一个方法,如果直接调用它的话,这不是一个线程,只是普通的方法调用。Thread.start()方法(native)启动线程,进入就绪状态,当cpu分配给该线程时间时,由JVM自动调用执行run()方法。

实际上,我们经常用的是runnable()接口实现的方法,原因如下:

1、如果你打算多重继承时,选用runnable(),因为一个类不能同时有两个父类,避免了单继承的限制

2、适合多个相同程序代码的线程处理同一个资源,把虚拟cpu(线程)同程序代码,数据有效分离,体现了面向对象的思想

3、有利于程序的健壮性,代码能够被多个线程共享,代码与数据独立。


注意:如果Thread类的run方法没有被覆盖,并且为该Thread对象设置了一个Runnable对象,该run方法会调用runnable对象的run方法。

3Callable和Future

1Callable规定的方法是call(),Runnable规定的方法是run()

2Callable的任务执行后可返回值,而Runnable的任务是不能返回值得。

3call方法可以抛出异常,run方法不可以


Future取得的结果类型和Callable返回的结果类型必须一致,通过泛型实现

Callable要采用ExecutorService的submit方法提交,返回的future对象可以取消任务。

CompletionService用于提交一组Callable任务,其take方法返回已完成的一个Callable任务对应的futrue对象。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值