学习JAVA多线程补充两个创建线程的方式

补充两个创建线程的方式

面试题: 创建线程有几个方式? 四个四个四个!!!

  • 创建线程的方式三:实现Callable接口 ————JDK5.0新增
  • 如何理解实现Callable接口的方式创建多线程比实现Runanable接口创建多线程方式强大
  • 1.call()可以有返回值
  • 2.call()可以抛出异常,被外面的操作捕获
  • 3.callable是支持泛型的
  • 方式四:用线程池的方式来创建多线程
  • 好处:
  • 1提高响应速度(减少了创建新线程的时间)
  • 2降低了资源消耗(重复利用线程池的线程,不需要每次都创建)
  • 3便于管理
  • corePoolSize;核心池的大小
  • maximumPoolSize 最大线程数
  • keepAliveTime 线程没有任务时候最多保持多长时间会终止

第三种创建线程的方法的源代码

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
//1创建一个实现Callable接口的实现类
class callables implements Callable{
//2实现call方法,将此线程需要的执行的操作声明在call()中
 @Override
 public Object call() throws Exception {
 	int sum=0;
  	   for (int i = 0; i <100;i++) {
  		 if (i%2==0) {
  		  System.out.println(i);
   		  sum+=i;}
   		  }
   		  return sum;  
 }}
 public class CallableTest {
 public static void main(String[] args) {
//3创建Callable接口对象
 callables a1=new callables();
//4j将此Callable接口实现类传递到FutureTask构造器中,创建FutureTask对象
  FutureTask F1 =new FutureTask(a1);
//5将FutureTask对象作为参数传递到Thread类构造器中创建对象, 以便于执行线程
  Thread T1 = new Thread(F1);

  T1.start();
  try {
//6获取Callable中call的返回值
//get()返回值即为FutureTask狗仔参数Callable实现重写call()的返回值
   Object sum= F1.get();
   } catch (InterruptedException e) {
   e.printStackTrace();
  } catch (ExecutionException e) {
   e.printStackTrace();}
   }}

方式三输出结果在这里插入图片描述
方式四的源代码

import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

class Number implements Runnable{
 @Override
 public void run() {
  for (int i = 0; i <=100; i++) {
   if (i%2==0) {
    System.out.println(Thread.currentThread().getName()+":"+i);
                   }
              }
         }
   }
class Number1 implements Runnable{
 @Override
 public void run() {
  for (int i = 0; i <=100; i++) {
   if (i%2==0) {
    System.out.println(Thread.currentThread().getName()+":"+i);
              }
          }
      }
  }
 public class ThreadPool {
 public static void main(String[] args) {
   ExecutorService service= Executors.newFixedThreadPool(10);
   service.execute(new Number());
   service.execute(new Number1());
   
   service.shutdown();
   }
   }

方式四输出结果
在这里插入图片描述

发布了29 篇原创文章 · 获赞 3 · 访问量 862

猜你喜欢

转载自blog.csdn.net/My_name_PeterLiu/article/details/103128900
今日推荐