02 多线程
1. Callable的实现和接收
public class CallDemo implements Callable<String> { @Override public String call() throws Exception { Thread.sleep(2000); return "线程回调方法的返回值"; }}
public class ThreadTest { public static void main(String[] args) { /*使用call回调方法有两种方式 * 1.用线程接收 * 2.用线程池接收*/ //1.用线程接收 CallDemo call = new CallDemo(); //1.创建call对象实例 /* *FutureTask是一个类,该类提供了一个Future的基本实现,具有启动和取消计算的方法,查询计算是否完整,并检索计算结果 * 结果只能在计算完成后才能检索;如果计算尚未完成,则get方法将其阻止, * 一旦计算完成,则无法重新启动或者取消计算(除非使用runAndReset()调用计算) * 该接口实现的接口:Runnable,Future<V>,RunnableFuture<V> */ FutureTask<String> ft = new FutureTask<>(call);//2.创建FutureTask Thread t1 = new Thread(ft);//3.创建线程 t1.start();//4.使用线程 String str = "";//5.创建变量接收 try { str = ft.get(); } catch (InterruptedException |ExecutionException e) { e.printStackTrace(); } System.out.println(str); //2.线程池 ExecutorService es = Executors.newFixedThreadPool(10); Future<String> ft2 = es.submit(call); String str2 = ""; try { str2 = ft2.get(); } catch (InterruptedException |ExecutionException e) { e.printStackTrace(); } System.out.println(str2); es.shutdown();//销毁线程池 }}
2.newFixedThreadPool的静态方法返回值详情
public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); }
public class Test { public static void main(String[] args) { ExecutorService es = Executors.newFixedThreadPool(10); /*ThreadPoolExecutor( (int corePoolSize => 线程池数量, int maximumPoolSize=> 线程池最大数量, long keepAliveTime=> 就是如果还有没有运行的空闲线程,那么空闲的线程就不能一直开着,所以就设置了一个存活时间, TimeUnit unit=> 时间单位:纳秒, BlockingQueue<Runnable> workQueue => 中文称其为工作队列,是一个用于创建内核线程的接口, 通过它创建的内核线程来执行内核其他模块排列到队列里的工作,创建的内核线程被称为工作者线程。 )) */ }}