java 实现多线程_Java多线程之实现多线程的三种方法

一、创建多线程的方法

1.继承Thread类

类 Thread的类头为:public class Thread implement runnable

继承Thread类,并重写Thread中的run方法

例如:

1 packagecom.dragon.test;2

3 public class MyThread extendsThread{4   @Override5   public voidrun(){6     System.out.println("创建多线程方法一");7   }8   public static voidmain(String[] args) {9     MyThread thread=newMyThread();10 thread.start();11     System.out.println("运行结束");12   }13

14}

运行结果:

e3020e992d5b3a606d0dfe8811dbc7d7.png

这说明在使用多线程技术时,代码的运行结果与代码执行顺序后调用代码的顺序是无关的

即线程是一个子任务,CPU以随机的时间来调用线程中的方法。

注意:1.不能多次调用Thread中的start()方法,否则会抛出IllegalThreadStateException异常。

2.启动线程的方法不是run()方法而是start方法,如果调用的是run()方法就是同步的,并不能异步执行。

3.执行start()方法的顺序不代表线程启动的顺序,即并不是说,越早调用某个线程的start()方法,它就能

越早的执行其中的run()方法。

2.实现Runnable接口

实现Runnable接口,重写run()方法

例如:

1 packagecom.dragon.test;2

3 public class MyThread implementsRunnable{4 @Override5 public voidrun(){6 System.out.println("创建多线程方法二");7 }8 public static voidmain(String[] args) {9 MyThread thread=newMyThread();10 Thread t=newThread(thread);11 t.start();12 System.out.println("运行结束");13 }14

15 }

运行结果与上述第一种的运行结果没有什么特殊之处

b5ba5d766ae3d379799c590645dd7a44.png

因为Thread类也实现了Runnable接口,所以Thread中的构造函数就可以传入一个Runnable接口的对象,也可以传入一个Thread类的对象

3.实现Callable接口

实现Callable接口,重写call()方法

例如:

packagecom.dragon.test;importjava.util.concurrent.Callable;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;importjava.util.concurrent.Future;public class MyThread implements Callable{public static voidmain(String[] args) {

ExecutorService threadPool=Executors.newSingleThreadExecutor();//启动多线程

Future future=threadPool.submit(newMyThread());try{

System.out.println("waiting thread to finish");

System.out.println(future.get());

}catch(Exception e){

e.printStackTrace();

}

}

@Overridepublic String call() throwsException {//TODO Auto-generated method stub

return "创建多线程方法三";

}

}

运行结果:

f72f8d21d5c467ebe52e02a7f8b7cd32.png

Callable接口是属于Executor,对比与Runnable接口功能的区别是:

(1).Callable可以在任务结束后提供一个返回值,Runnable没有这个功能

(2).Callable中的call()方法可以抛出异常,而Runnable的run()方法不能抛出异常

(3).运行Callable可以拿到一个Future对象,Future独享表示异步计算的结果,它提供了

检查计算是否完成的方法。由于线程属于异步计算模型,因此无法从别的线程中得到函数

的返回值,在这种情况下,就可以使用Future来监视目标线程调用call()方法的情况,

放调用Future的get()方法以获取结果时,当前线程就会阻塞,知道call()方法结束返回结果。

二、推荐实现多线程的方法--实现Runnable接口

原因:

(1).Thread类中定义了多种方法可以被派生类使用或重写,但是只有run()方法必须被重写的,在run()方法中实现啊这个线程的主要功能,这就是Runnable接口所需实现的方法

(2).通过继承Thread的实现方法与实现Runnable接口的效果相同,并且Java只能是单继承、多实现,如果一个类中已经继承其他所需的类,那实现一个接口是必须的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值