写点什么

Java- 进阶:多线程 2

  • 2022 年 4 月 18 日
  • 本文字数:1648 字

    阅读完需:约 5 分钟

  • 如果在所有线程处于活动状态时提交附加任务,则在有可用线程之前,附加任务将在队列中等待

  • 创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程

  • 可保证顺序地执行各个任务

3. 提交任务

  • Runnable 接口

  • Callable 接口类似于 Runnable,用来指定线程的任务。其中的 call() 方法,用来返回线程任务执行完毕后的结果,call 方法可抛出异常

4. 使用线程池中线程对象的步骤:

  • 创建线程池对象

  • 创建 Runnable 接口/Callable 接口 子类对象

  • 提交 Runnable 接口/Callable 接口 子类对象

  • 关闭线程池


public class ThreadPool {public static void main(String[] args) throws ExecutionException, InterruptedException {//创建一个 newCachedThreadPoolExecutorService executorService = Executors.newFixedThreadPool(5);//操作线程池//向线程池提交任务 executorService.submit(new Runnable() {@Overridepublic void run() {System.out.println("hello, thread pool");}});


//Callable 接口的使用 Future<Integer> future = executorService.submit(new Callable<Integer>() {


@Overridepublic Integer call 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》开源 () throws Exception {TimeUnit.SECONDS.sleep(3);int sum = 0;for (int i = 0; i < 10; i++) {sum += i;}return sum;}});System.out.println(future);System.out.println(future.get());}}

四、定时器 Timer

1. 概述

  • 调度定时任务,帮助我们在稍后的时刻执行定时任务。一种工具,线程用其安排以后在后台线程中执行的任务。可安排任务 执行一次,或者 定期重复执行

2. TimerTask 定时任务

  • 在 timer 中所有的定时任务都是运行在同一个线程中


  1. cancel 取消定时任务


public class TimerDemo {public static void main(String[] args) {//定义一个定时器// 在 timer 中所有的定时任务都是运行在同一个线程中 Timer timer = new Timer(); //默认不是守护线程


//在定时器上调度,定时任务 timer.schedule(new MyTimerTask(), 3000);timer.schedule(new MyTimerTask(), 1000);


//调度器重复执行定时任务 timer.schedule(new MyTimerTask(timer), 0, 2000);}}


class MyTimerTask extends TimerTask {Timer timer;public MyTimerTask(Timer timer) {this.timer = timer;}


@Overridepublic void run() {//在输出之前,取消定时任务//cancel();//利用 Timer 的 cancel 方法取消定时任务,其实 timer 的 cance 方法,是终止 Timer 本身 ti Java 开源项目【ali1024.coding.net/public/P7/Java/git】 mer.cancel();System.out.println("hello timer");}}

五、多线程和异常

  • 在 Thread 类中,不可以抛出编译型异常,但是可以抛出运行时异常

  • 当 运行时异常抛出线程(溢出线程),能不能捕获?


java 语言,并不能直接用 try-catch 代码块捕获,溢出线程的异常,这是 java 语言实现上的一个遗憾,但是,并不是说,溢出线程的异常开发者就没办法捕获了。---> Thread.UncaughtExceptionHandler


public class supplement01 {public static void main(String[] args) {//我们可以通过设置 UncaughtExceptionHandler 对象,让该对象捕获溢出线程的异常// callback 回调 Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {@Overridepublic void uncaughtException(Thread t, Throwable e) {// 这个方法,会在日志模块 -》 将这些异常信息,通过流保存到文件中//处理溢出线程的异常 System.out.println("DefaultUncaughtExceptionHandler");}});


//在主线程中捕获异常 CatchThreadException1 catchThreadException = new CatchThreadException1();catchThreadException.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {

总结

本文从基础到高级再到实战,由浅入深,把 MySQL 讲的清清楚楚,明明白白,这应该是我目前为止看到过最好的有关 MySQL 的学习笔记了,我相信如果你把这份笔记认真看完后,无论是工作中碰到的问题还是被面试官问到的问题都能迎刃而解!


MySQL50 道高频面试题整理:



用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
Java-进阶:多线程2_Java_爱好编程进阶_InfoQ写作平台