当前位置: 首页 > 科技观察

使用Java的多线程和线程池

时间:2023-03-18 02:35:15 科技观察

多线程大大提高了程序运行的效率。我们在开发过程中经常会开一个线程来执行一些比较耗时的工作。启动线程的方式有4种,我会在后面的文章中详细讲解。InheritingThreadInheritingThreadtoperformtasks确实可以开一个线程来执行任务。如果经常开启一些线程,也会造成系统资源的浪费。publicstaticclassMythreadextendsThread{@Overridepublicvoidrun(){System.out.println("当前线程"+Thread.currentThread().getId());inti=10/2;System.out.println("运行结果"+i);}}//调用线程。publicstaticvoidmain(String[]args)throwsExecutionException,InterruptedException{/**线程执行方式*/Mythreadmythread=newMythread();mythread.start();//启动线程System.out.println("main--end");}实现Runnale接口。publicstaticclassMyRunableimplementsRunnable{@Overridepublicvoidrun(){System.out.println("当前线程"+Thread.currentThread().getId());inti=10/2;System.out.println("运行结果"+i);}}转移。/***runable启动方法*/MyRunablerunable=newMyRunable();newThread(runable).start();System.out.println("main--end");Callable/***Callable可以允许一个返回值*/publicstaticclassCallale01implementsCallable{@OverridepublicIntegercall()throwsException{System.out.println("当前线程"+Thread.currentThread().getId());inti=10/2;System.out.println("运行结果"+i);returni;}}调用。这里需要使用callable构建futureTask/***callale启动方法*/FutureTaskfutureTask=newFutureTask<>(newCallale01());//获取返回结果。Integeri=futureTask.get();newThread(futureTask).start();System.out.println("返回结果为:"+i);线程池线程池是我们java开发,经常用来开启多线程的方式,线程池,自己管理线程。可以节省系统资源。通常我们会在一些配置类中写入如下一些配置/***七个参数*corePoolSize:1.核心线程数【一直存在】:创建线程池后。就绪的线程数。*maxinumPoolSize:2最大线程数*keepaliveTime:生存时间。空闲线程的最长等待时间。*unit等待时间单位*blockingQueue阻塞队列。如果任务很多,就会放到队列中,只要有线程空闲,就会去队列中取。*threadFactory:线程工厂。*RejectExecutionHandler:如果队列已满。遵循我们指定的策略。拒绝执行任务。**/ThreadPoolExecutorexecutor=newThreadPoolExecutor(5,100,10,TimeUnit.SECONDS,newLinkedBlockingQueue<>(100),Executors.defaultThreadFactory(),newThreadPoolExecutor.AbortPolicy());四个公共线程池。1newCachedThreadPool()创建一个可缓存的线程池。如果线程池长度超过处理需要,可以灵活回收空闲线程。如果没有,它可以被回收。然后创建一个新线程。Executors.newCachedThreadPool();2.newFixedThreadPool(6)创建一个固定大小的线程池。3newScheduledThreadPool()用于定时任务的线程池。4.newSingleThreadExecutor()Executors.newSingleThreadExecutor();