21道并发编程面试题(2)

    V get(Long timeout,TimeUnit unit):获取异步执行结果,如果没哟结果可用,此方法会阻塞,但是会有时间限制,如果阻塞时间超过设定的timeout时间,该方法将抛出异常;

    boolean isDone():如果任务执行结束,无论是正常结束或是中途取消还是发生异常,都返回true;

    boolean isCanceller():如果任务完成前被取消,则返回true;

    boolean cancel(boolean mayInterrupRunning):如果任务还没有开始,执行cancel方法将返回false;如果任务已经启动,执行cancel方法将以中断执行此任务线程的方式来试图停止任务,如果停止成功,返回true;

    当任务已经启动,执行cancel(false)方法将不会对正在执行的任务线程产生影响(让线程正常执行到完成),此时返回false;

    当任务已经启动,执行cancel方法将返回false,MayInterruptRunning参数表示是否中断执行中的线程;

    实际上Future提供了三种功能:

      1.能够中断执行中的任务;

      2.判断任务是否执行完成;

      3.获取任务执行完成后的结果;

5.线程池创建的方式   5.1 newCachedThreadPool

    newCachedThreadPool:可缓存线程池,先查看池中有没有以前建立的线程,如果有,就直接使用;如果没有,就创建一个新的线程加入池中,缓存型池通常用于执行一些生存期很短的异步型任务;

package com.wn.threadpool; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class NewCachedThreadPoolTest { //无限大侠线程池,JVM自动回收 public static void main( String[] args ){ ExecutorService newCachedThreadPool = Executors.newCachedThreadPool(); for (int i=1;i<=10;i++){ newCachedThreadPool.execute(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName()); } }); } } }

  5.2 newFixedThreadPool

    newFixedThreadPool:创建一个可重用固定个数的线程池,以共享的无界队列方式来运行这些线程;

package com.wn.threadpool; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class NewFixedThreadPoolTest { public static void main( String[] args ){ ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(3); for (int i=0;i<10;i++){ newFixedThreadPool.execute(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName()); } }); } } }

  5.3 newScheduledThreadPool

    newScheduledThreadPool:创建一个定长线程池,支持定时及周期性任务执行

package com.wn.threadpool; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class NewScheduledThreadPoolTest { public static void main( String[] args ) { ScheduledExecutorService newScheduledThreadPool = Executors.newScheduledThreadPool(3); for (int i=0;i<10;i++){ newScheduledThreadPool.schedule(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName()); } },3, TimeUnit.SECONDS); } } }

  5.4 newSingleThreadExecutor

    newSingleThreadExecutor:创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序执行;

package com.wn.threadpool; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class NewSingleThreadExecutorTest { public static void main( String[] args ){ ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor(); for (int i=0;i<10;i++){ final int index=i; newSingleThreadExecutor.execute(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName()+"正在被执行,index:"+index); try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } }); } } }

6.Java当中线程状态有哪些  

  6.1 初始状态(New):

    线程对象创建出来后,没有调用start方法,线程处于初始状态;

  6.2 运行状态:

    1.就绪状态(Ready):调用了Start方法,等待CPU分配资源;

    2.运行状态(RUNNING):CPU分配资源给该线程,该线程处于运行状态;

  6.3 阻塞状态 (BLOCKED):

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/c628f105a4eead5224f1076e66487750.html