java多线程并发编程,JAVA并发编程

  java多线程并发编程,JAVA并发编程

  00-1010一、创建和运行线程的五种方法一:继承线程类二:实现可运行接口三:实现可调用接口四:线程池执行五:线程池提交总结

  

目录

 

  00-1010这种方法是最基本的一种。学过java的朋友都知道,这里就不赘述了。注:覆盖实现使用的是run方法,运行线程是start方法。

  类第一种方式扩展Thread { @ override public void run(){ system . out . println(第一种方式实现thread 3360继承Thread类);}//模拟测试公共静态void main(string[]args){ new first way()。start();}}

  00-1010第二种实现方法还是很基础的,继承runnable接口,重写Run方法实现线程运行逻辑。注意,所需的3360运行线程需要一个新线程。

  类第二种方式实现Runnable { @ override public void run(){ system . out . println(第二种方式实现线程3360实现Runnable接口);}//模拟测试公共静态void main(string[]args){ new thread(newsecondway())。start();}}

  00-1010第三种方式是实现可调用接口。可调用接口和可运行接口都可以实现线程。

  类第三种方式实现可调用字符串{ @ override public String call()throws exception { system . out . println(第三种方式实现线程3360实现可调用接口);Return“可调用接口接受返回值并可以引发异常”;}//模拟测试公共静态void main (string [] args)抛出执行异常,中断异常{ FutureTaskString Future Task=NewFutureTask(new third way());新线程(futureTask)。start();//阻塞方法获取调用方法的返回值system . out . println(future task . get());//Print: Callable接口有返回值,可以抛出异常} }区别如下:.

  callable接口实现thread方法是Call,Runable接口实现thread方法是runcallable带返回值,Runable接口不能有返回值callable接口方法调用返回值可以设置泛型,在下面的例子中,使用String数据类型Callable接口方法调用方法可以抛出异常,Runable接口run方法不能抛出异常Callable接口方法通过新线程运行(futureTask)。start(),FutureTask的get方法可以获取可调用接口方法call method的返回值。如果可调用接口方法call method异常,那么在调用FutureTask的get方法时也会抛出同样的异常。

  00-1010从JDK5版本开始,java默认提供了线程池的支持。通过线程池运行线程,可以避免线程无限膨胀导致的应用宕机,也节省了频繁创建和销毁线程的资源和时间成本。

  公共类FourthWay实现Runnable { @ Override public void run(){ system . out . println(thread . current th

  read().getName() + ":实现线程的方式Runnable接口,但运行方式不一样,使用线程池"); } public static void main(String[] args) { //创建一个固定大小的线程池 ExecutorService threadPool = Executors.newFixedThreadPool(5); for(int i = 0;i < 10;i++){ threadPool.execute(new FourthWay()); } }}线程池ExecutorService使用execute方法运行Runnable接口run方法的线程实现,execute方法与run方法的共同特点是没有返回值。

  

pool-1-thread-5:实现线程的方式Runnable接口,但运行方式不一样,使用线程池pool-1-thread-2:实现线程的方式Runnable接口,但运行方式不一样,使用线程池pool-1-thread-4:实现线程的方式Runnable接口,但运行方式不一样,使用线程池pool-1-thread-4:实现线程的方式Runnable接口,但运行方式不一样,使用线程池pool-1-thread-4:实现线程的方式Runnable接口,但运行方式不一样,使用线程池pool-1-thread-1:实现线程的方式Runnable接口,但运行方式不一样,使用线程池pool-1-thread-4:实现线程的方式Runnable接口,但运行方式不一样,使用线程池pool-1-thread-3:实现线程的方式Runnable接口,但运行方式不一样,使用线程池pool-1-thread-2:实现线程的方式Runnable接口,但运行方式不一样,使用线程池pool-1-thread-5:实现线程的方式Runnable接口,但运行方式不一样,使用线程池

从上面的结果中可以看出,线程池中包含五个线程。线程运行完成之后并不销毁,而是还回到线程池,下一次执行时从线程池中获取线程资源再次运行。

 

  

 

  

第五种:线程池 + submit

下面的例子线程池ExecutorService使用submit方法运行Callable接口call方法的线程实现,submit方法与call方法的共同特点是存在返回值。

 

  Callable接口call方法的返回值可以由泛型定义ExecutorService线程池submit方法的返回值是FutureFuture的get方法可以获取call方法的返回值,同时如果call方法抛出异常,Future的get方法也会抛出异常。

  

public class FifthWay implements Callable<String> { @Override public String call() throws Exception { return Thread.currentThread().getName() + ":Callable接口带返回值,可以抛出异常"; } //模拟测试 public static void main(String[] args) throws ExecutionException, InterruptedException { //保存多线程执行结果 List<String> retList = new ArrayList<>(); //创建一个固定大小的线程池 ExecutorService threadPool = Executors.newFixedThreadPool(5); for(int i = 0;i < 10;i++){ Future<String> future = threadPool.submit(new FifthWay()); retList.add(future.get()); } //java8 语法,打印retlist retList.forEach(System.out::println); }}

上文代码中有一个小小的语法糖,retList.forEach(System.out::println);是java8提供的方法引用

 

  

pool-1-thread-1:Callable接口带返回值,可以抛出异常pool-1-thread-2:Callable接口带返回值,可以抛出异常pool-1-thread-3:Callable接口带返回值,可以抛出异常pool-1-thread-4:Callable接口带返回值,可以抛出异常pool-1-thread-5:Callable接口带返回值,可以抛出异常pool-1-thread-1:Callable接口带返回值,可以抛出异常pool-1-thread-2:Callable接口带返回值,可以抛出异常pool-1-thread-3:Callable接口带返回值,可以抛出异常pool-1-thread-4:Callable接口带返回值,可以抛出异常pool-1-thread-5:Callable接口带返回值,可以抛出异常

 

  

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注盛行IT的更多内容!

 

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: